From: Robert Varga Date: Sun, 2 Feb 2020 11:46:05 +0000 (+0100) Subject: Upstream StmtContextUtils.producesDeclared() X-Git-Tag: v4.0.8~6 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=24859660e4f1ad73ee87e161921b9bb50cde73f8;p=yangtools.git Upstream StmtContextUtils.producesDeclared() With Java 8 we can make this method readily available as a default, without having to have it in a separate utils method. Since we are at it, also introduce producesEffective(), which allows us to infer details about the effective instance. Also migrate open-coded equivalents to use the common method where possible. Change-Id: Ie2590c460296efea9fafe6a52bb3548bafe0ae0c Signed-off-by: Robert Varga (cherry picked from commit 61507ff3a5b8960b33cf71d90c61c53f2a8b2aff) --- diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java index f70283c0f7..994c2a5a07 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java @@ -1049,7 +1049,7 @@ public abstract class StatementContextBase, E final Object argument = getStatementArgument(); if (argument instanceof QName) { final QName qname = (QName) argument; - if (StmtContextUtils.producesDeclared(this, UsesStatement.class)) { + if (producesDeclared(UsesStatement.class)) { return maybeParentPath.orElse(null); } @@ -1062,9 +1062,8 @@ public abstract class StatementContextBase, E return parentPath.createChild(qname); } if (argument instanceof SchemaNodeIdentifier - && (StmtContextUtils.producesDeclared(this, AugmentStatement.class) - || StmtContextUtils.producesDeclared(this, RefineStatement.class) - || StmtContextUtils.producesDeclared(this, DeviationStatement.class))) { + && (producesDeclared(AugmentStatement.class) || producesDeclared(RefineStatement.class) + || producesDeclared(DeviationStatement.class))) { return parentPath.createChild(((SchemaNodeIdentifier) argument).getPathFromRoot()); } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java index b51b067806..c34a126a4f 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java @@ -204,9 +204,8 @@ abstract class AbstractAugmentStatementSupport static void copyFromSourceToTarget(final StatementContextBase sourceCtx, final StatementContextBase targetCtx) { - final CopyType typeOfCopy = UsesStatement.class.equals(sourceCtx.coerceParentContext().getPublicDefinition() - .getDeclaredRepresentationClass()) ? CopyType.ADDED_BY_USES_AUGMENTATION - : CopyType.ADDED_BY_AUGMENTATION; + final CopyType typeOfCopy = sourceCtx.coerceParentContext().producesDeclared(UsesStatement.class) + ? CopyType.ADDED_BY_USES_AUGMENTATION : CopyType.ADDED_BY_AUGMENTATION; /* * Since Yang 1.1, if an augmentation is made conditional with a * "when" statement, it is allowed to add mandatory nodes. @@ -264,7 +263,7 @@ abstract class AbstractAugmentStatementSupport final StatementContextBase targetCtx, final CopyType typeOfCopy, final boolean skipCheckOfMandatoryNodes) { - if (WhenStatement.class.equals(sourceCtx.getPublicDefinition().getDeclaredRepresentationClass())) { + if (sourceCtx.producesDeclared(WhenStatement.class)) { return; } @@ -274,12 +273,9 @@ abstract class AbstractAugmentStatementSupport } // Data definition statements must not collide on their namespace - if (DataDefinitionStatement.class.isAssignableFrom( - sourceCtx.getPublicDefinition().getDeclaredRepresentationClass())) { + if (sourceCtx.producesDeclared(DataDefinitionStatement.class)) { for (final StmtContext subStatement : targetCtx.allSubstatements()) { - if (DataDefinitionStatement.class.isAssignableFrom( - subStatement.getPublicDefinition().getDeclaredRepresentationClass())) { - + if (subStatement.producesDeclared(DataDefinitionStatement.class)) { InferenceException.throwIf( Objects.equals(sourceCtx.getStatementArgument(), subStatement.getStatementArgument()), sourceCtx.getStatementSourceReference(), diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/base/BaseStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/base/BaseStatementSupport.java index e849e7ea01..ea15f9d965 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/base/BaseStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/base/BaseStatementSupport.java @@ -60,7 +60,7 @@ public final class BaseStatementSupport extends AbstractQNameStatementSupport baseStmtCtx) { final Mutable baseParentCtx = baseStmtCtx.getParentContext(); - if (StmtContextUtils.producesDeclared(baseParentCtx, IdentityStatement.class)) { + if (baseParentCtx.producesDeclared(IdentityStatement.class)) { final QName baseIdentityQName = baseStmtCtx.coerceStatementArgument(); final ModelActionBuilder baseIdentityAction = baseStmtCtx.newInferenceAction( diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java index 807fc49406..3019ef1cd2 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesStatementSupport.java @@ -230,8 +230,7 @@ public final class UsesStatementSupport private static void resolveUsesNode(final Mutable usesNode, final StmtContext targetNodeStmtCtx) { for (final Mutable subStmtCtx : usesNode.mutableDeclaredSubstatements()) { - if (StmtContextUtils.producesDeclared(subStmtCtx, RefineStatement.class) - && areFeaturesSupported(subStmtCtx)) { + if (subStmtCtx.producesDeclared(RefineStatement.class) && areFeaturesSupported(subStmtCtx)) { performRefine(subStmtCtx, targetNodeStmtCtx); } } diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java index fc10ce193f..09807c0566 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContext.java @@ -108,6 +108,15 @@ public interface StmtContext, E extends Effect return verifyNotNull(getStatementArgument(), "Statement context %s does not have an argument", this); } + default > boolean producesDeclared(final Class type) { + return type.isAssignableFrom(getPublicDefinition().getDeclaredRepresentationClass()); + } + + default , Z extends EffectiveStatement> boolean producesEffective( + final Class type) { + return type.isAssignableFrom(getPublicDefinition().getEffectiveRepresentationClass()); + } + /** * Return the {@link SchemaPath} of this statement. Not all statements have a SchemaPath, in which case * {@link Optional#empty()} is returned. diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java index 7d4ffbfe0f..8fc0cbd33f 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java @@ -52,7 +52,7 @@ public final class StmtContextUtils { public static > A firstAttributeOf( final Iterable> contexts, final Class declaredType) { for (final StmtContext ctx : contexts) { - if (producesDeclared(ctx, declaredType)) { + if (ctx.producesDeclared(declaredType)) { return (A) ctx.getStatementArgument(); } } @@ -62,7 +62,7 @@ public final class StmtContextUtils { @SuppressWarnings("unchecked") public static > A firstAttributeOf(final StmtContext ctx, final Class declaredType) { - return producesDeclared(ctx, declaredType) ? (A) ctx.getStatementArgument() : null; + return ctx.producesDeclared(declaredType) ? (A) ctx.getStatementArgument() : null; } public static > A firstSubstatementAttributeOf( @@ -74,7 +74,7 @@ public final class StmtContextUtils { public static > StmtContext findFirstDeclaredSubstatement( final StmtContext stmtContext, final Class declaredType) { for (final StmtContext subStmtContext : stmtContext.declaredSubstatements()) { - if (producesDeclared(subStmtContext, declaredType)) { + if (subStmtContext.producesDeclared(declaredType)) { return (StmtContext) subStmtContext; } } @@ -102,7 +102,7 @@ public final class StmtContextUtils { final StmtContext stmtContext, final Class declaredType) { final ImmutableList.Builder> listBuilder = ImmutableList.builder(); for (final StmtContext subStmtContext : stmtContext.declaredSubstatements()) { - if (producesDeclared(subStmtContext, declaredType)) { + if (subStmtContext.producesDeclared(declaredType)) { listBuilder.add((StmtContext) subStmtContext); } } @@ -114,7 +114,7 @@ public final class StmtContextUtils { final StmtContext stmtContext, final Class type) { final ImmutableList.Builder> listBuilder = ImmutableList.builder(); for (final StmtContext subStmtContext : stmtContext.effectiveSubstatements()) { - if (producesDeclared(subStmtContext, type)) { + if (subStmtContext.producesDeclared(type)) { listBuilder.add((StmtContext) subStmtContext); } } @@ -133,7 +133,7 @@ public final class StmtContextUtils { public static > StmtContext findFirstEffectiveSubstatement( final StmtContext stmtContext, final Class declaredType) { for (final StmtContext subStmtContext : stmtContext.effectiveSubstatements()) { - if (producesDeclared(subStmtContext, declaredType)) { + if (subStmtContext.producesDeclared(declaredType)) { return (StmtContext) subStmtContext; } } @@ -193,6 +193,7 @@ public final class StmtContextUtils { return null; } + @Deprecated public static boolean producesDeclared(final StmtContext ctx, final Class> type) { return type.isAssignableFrom(ctx.getPublicDefinition().getDeclaredRepresentationClass()); @@ -238,8 +239,7 @@ public final class StmtContextUtils { * if supplied statement context is null */ public static boolean isUnrecognizedStatement(final StmtContext stmtCtx) { - return UnrecognizedStatement.class - .isAssignableFrom(stmtCtx.getPublicDefinition().getDeclaredRepresentationClass()); + return stmtCtx.producesDeclared(UnrecognizedStatement.class); } public static boolean checkFeatureSupport(final StmtContext stmtContext, @@ -586,9 +586,9 @@ public final class StmtContextUtils { final StmtContext rootCtx = ctx.getRoot(); final QNameModule qnameModule; - if (producesDeclared(rootCtx, ModuleStatement.class)) { + if (rootCtx.producesDeclared(ModuleStatement.class)) { qnameModule = rootCtx.getFromNamespace(ModuleCtxToModuleQName.class, rootCtx); - } else if (producesDeclared(rootCtx, SubmoduleStatement.class)) { + } else if (rootCtx.producesDeclared(SubmoduleStatement.class)) { final String belongsToModuleName = firstAttributeOf(rootCtx.declaredSubstatements(), BelongsToStatement.class); qnameModule = rootCtx.getFromNamespace(ModuleNameToModuleQName.class, belongsToModuleName); @@ -608,8 +608,9 @@ public final class StmtContextUtils { return qnameModule; } - if (producesDeclared(ctx.getRoot(), SubmoduleStatement.class)) { - final String moduleName = ctx.getRoot().getFromNamespace(BelongsToPrefixToModuleName.class, prefix); + final StmtContext root = ctx.getRoot(); + if (root.producesDeclared(SubmoduleStatement.class)) { + final String moduleName = root.getFromNamespace(BelongsToPrefixToModuleName.class, prefix); return ctx.getFromNamespace(ModuleNameToModuleQName.class, moduleName); } @@ -631,8 +632,7 @@ public final class StmtContextUtils { public static Optional getLatestRevision(final Iterable> subStmts) { Revision revision = null; for (final StmtContext subStmt : subStmts) { - if (subStmt.getPublicDefinition().getDeclaredRepresentationClass().isAssignableFrom( - RevisionStatement.class)) { + if (subStmt.producesDeclared(RevisionStatement.class)) { if (revision == null && subStmt.getStatementArgument() != null) { revision = (Revision) subStmt.getStatementArgument(); } else {