From e763e5227cf4dfd535d2fbfc92d8f289ef38a799 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 6 Dec 2020 13:49:28 +0100 Subject: [PATCH] Move findSubstatementArgument()/hasSubstatement() to BoundStmtCtx Since we have StmtContext and BoundStmtCtx unified, move hasSubstatement() into BoundStmtCtx and implement it in ReactorStmtCtx. This allows better access to this functionality. JIRA: YANGTOOLS-1157 Change-Id: I33eaba254c82e4b8e0152c03d8da91fef4453f63 Signed-off-by: Robert Varga --- .../reactor/InferredStatementContext.java | 5 +- .../parser/stmt/reactor/ReactorStmtCtx.java | 17 ++++++ .../yang/parser/spi/meta/BoundStmtCtx.java | 22 ++++++++ .../yang/parser/spi/meta/StmtContext.java | 34 ------------ .../parser/spi/meta/StmtContextDefaults.java | 53 ------------------- .../parser/spi/meta/StmtContextUtils.java | 2 +- 6 files changed, 42 insertions(+), 91 deletions(-) delete mode 100644 yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextDefaults.java diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java index a424cf795b..1f062e62e6 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java @@ -37,7 +37,6 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.OnDemandSchemaTreeStorageNode; import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.StorageNodeType; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextDefaults; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; import org.slf4j.Logger; @@ -191,7 +190,7 @@ final class InferredStatementContext, E extend public > @NonNull Optional findSubstatementArgument( final @NonNull Class type) { if (substatements instanceof List) { - return StmtContextDefaults.findSubstatementArgument(this, type); + return super.findSubstatementArgument(type); } final Optional templateArg = prototype.findSubstatementArgument(type); @@ -207,7 +206,7 @@ final class InferredStatementContext, E extend @Override public boolean hasSubstatement(final @NonNull Class> type) { - return substatements instanceof List ? StmtContextDefaults.hasSubstatement(prototype, type) + return substatements instanceof List ? super.hasSubstatement(type) // We do not allow deletion of partially-materialized statements, hence this is accurate : prototype.hasSubstatement(type); } diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java index 212cae9035..e51579b703 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ReactorStmtCtx.java @@ -238,6 +238,23 @@ abstract class ReactorStmtCtx, E extends Effec return getOriginalCtx().map(StmtContext::buildEffective).orElse(null); } + @Override + // Non-final due to InferredStatementContext's override + public > @NonNull Optional findSubstatementArgument( + final @NonNull Class type) { + return allSubstatementsStream() + .filter(ctx -> ctx.isSupportedToBuildEffective() && ctx.producesEffective(type)) + .findAny() + .map(ctx -> (X) ctx.getArgument()); + } + + @Override + // Non-final due to InferredStatementContext's override + public boolean hasSubstatement(final @NonNull Class> type) { + return allSubstatementsStream() + .anyMatch(ctx -> ctx.isSupportedToBuildEffective() && ctx.producesEffective(type)); + } + @Override @Deprecated @SuppressWarnings("unchecked") diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/BoundStmtCtx.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/BoundStmtCtx.java index 147b1ec2f2..80b08c0044 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/BoundStmtCtx.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/BoundStmtCtx.java @@ -11,9 +11,11 @@ import static com.google.common.base.Verify.verifyNotNull; import com.google.common.annotations.Beta; import com.google.common.base.VerifyException; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.YangVersion; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; /** * A {@link CommonStmtCtx} which has additionally been bound to a {@link StatementSupport}. It provides @@ -46,4 +48,24 @@ public interface BoundStmtCtx extends CommonStmtCtx { * @return YANG version used to bind this statement */ @NonNull YangVersion yangVersion(); + + /** + * Search of any child statement context of specified type and return its argument. If such a statement exists, it + * is assumed to have the right argument. Users should be careful to use this method for statements which have + * cardinality {@code 0..1}, otherwise this method can return any one of the statement's argument. + * + * @param Substatement argument type + * @param Substatement effective statement representation + * @param type Effective statement representation being look up + * @return {@link Optional#empty()} if no statement exists, otherwise the argument value + */ + > @NonNull Optional findSubstatementArgument(@NonNull Class type); + + /** + * Check if there is any child statement context of specified type. + * + * @param type Effective statement representation being look up + * @return True if such a child statement exists, false otherwise + */ + boolean hasSubstatement(@NonNull Class> type); } 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 1f090b3c0f..dcbafed837 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 @@ -354,38 +354,4 @@ public interface StmtContext, E extends Effect void setIsSupportedToBuildEffective(boolean isSupportedToBuild); } - - /** - * Search of any child statement context of specified type and return its argument. If such a statement exists, it - * is assumed to have the right argument. Users should be careful to use this method for statements which have - * cardinality {@code 0..1}, otherwise this method can return any one of the statement's argument. - * - *

- * The default implementation defers to - * {@link StmtContextDefaults#findSubstatementArgument(StmtContext, Class)}, subclasses are expected to provide - * optimized implementation if possible. - * - * @param Substatement argument type - * @param Substatement effective statement representation - * @param type Effective statement representation being look up - * @return {@link Optional#empty()} if no statement exists, otherwise the argument value - */ - default > @NonNull Optional findSubstatementArgument( - final @NonNull Class type) { - return StmtContextDefaults.findSubstatementArgument(this, type); - } - - /** - * Check if there is any child statement context of specified type. - * - *

- * The default implementation defers to {@link StmtContextDefaults#hasSubstatement(StmtContext, Class)}, - * subclasses are expected to provide optimized implementation if possible. - * - * @param type Effective statement representation being look up - * @return True if such a child statement exists, false otherwise - */ - default boolean hasSubstatement(final @NonNull Class> type) { - return StmtContextDefaults.hasSubstatement(this, type); - } } diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextDefaults.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextDefaults.java deleted file mode 100644 index e885bf8dff..0000000000 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextDefaults.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2020 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.parser.spi.meta; - -import java.util.Optional; -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; - -/** - * Default implementations for various {@link StmtContext} methods. Code hosted here is meant for use by actual - * {@link StmtContext} implementations, not for general use by others. - */ -public final class StmtContextDefaults { - private StmtContextDefaults() { - // Hidden on purpose - } - - /** - * Default implementation of {@link StmtContext#findSubstatementArgument(Class)}. See that method for API contract. - * - * @param Substatement argument type - * @param Substatement effective statement representation - * @param stmt Statement context to search - * @param type Effective statement representation being look up - * @return Effective statement argument, if found - */ - @SuppressWarnings({"unchecked" }) - public static > @NonNull Optional findSubstatementArgument( - final @NonNull StmtContext stmt, final @NonNull Class type) { - return stmt.allSubstatementsStream() - .filter(ctx -> ctx.isSupportedToBuildEffective() && ctx.producesEffective(type)) - .findAny() - .map(ctx -> (A) ctx.getArgument()); - } - - /** - * Default implementation of {@link StmtContext#hasSubstatement(Class)}. See that method for API contract. - * - * @param stmt Statement context to search - * @param type Effective statement representation being look up - * @return True if a match is found, false otherwise - */ - public static boolean hasSubstatement(final @NonNull StmtContext stmt, - final @NonNull Class> type) { - return stmt.allSubstatementsStream() - .anyMatch(ctx -> ctx.isSupportedToBuildEffective() && ctx.producesEffective(type)); - } -} 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 3a0a1c8481..8aaad4478c 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 @@ -151,7 +151,7 @@ public final class StmtContextUtils { * @param statement argument type * @param declared statement type * @return statement context that was searched for or null if was not found - * @deprecated Use {@link StmtContext#findSubstatementArgument(Class)} instead. + * @deprecated Use {@link BoundStmtCtx#findSubstatementArgument(Class)} instead. */ @Deprecated(forRemoval = true) public static > StmtContext findFirstSubstatement( -- 2.36.6