package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.description;
import com.google.common.collect.ImmutableList;
-import java.util.Optional;
-import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStringStatementSupport;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
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;
public final class DescriptionStatementSupport
return value;
}
- @Override
- public Optional<? extends Mutable<?, ?, ?>> copyAsChildOf(final Mutable<?, ?, ?> stmt,
- final Mutable<?, ?, ?> parent, final CopyType type, final QNameModule targetModule) {
- return StmtContextUtils.isChildOfGrouping(stmt) ? Optional.empty()
- : super.copyAsChildOf(stmt, parent, type, targetModule);
- }
-
@Override
protected SubstatementValidator getSubstatementValidator() {
return SUBSTATEMENT_VALIDATOR;
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.reference;
import com.google.common.collect.ImmutableList;
-import java.util.Optional;
-import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStringStatementSupport;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
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;
public final class ReferenceStatementSupport
return value;
}
- @Override
- public Optional<? extends Mutable<?, ?, ?>> copyAsChildOf(final Mutable<?, ?, ?> stmt,
- final Mutable<?, ?, ?> parent, final CopyType type, final QNameModule targetModule) {
- return StmtContextUtils.isChildOfGrouping(stmt) ? Optional.empty()
- : super.copyAsChildOf(stmt, parent, type, targetModule);
- }
-
@Override
protected SubstatementValidator getSubstatementValidator() {
return SUBSTATEMENT_VALIDATOR;
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.status;
import com.google.common.collect.ImmutableList;
-import java.util.Optional;
import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.model.api.Status;
import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
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.spi.source.SourceException;
}
}
- @Override
- public Optional<? extends Mutable<?, ?, ?>> copyAsChildOf(final Mutable<?, ?, ?> stmt,
- final Mutable<?, ?, ?> parent, final CopyType type, final QNameModule targetModule) {
- return StmtContextUtils.isChildOfGrouping(stmt) ? Optional.empty()
- : super.copyAsChildOf(stmt, parent, type, targetModule);
- }
-
@Override
protected SubstatementValidator getSubstatementValidator() {
return SUBSTATEMENT_VALIDATOR;
}
// FIXME: YANGTOOLS-652: this map looks very much like InferredStatementContext.REUSED_DEF_SET
- private static final ImmutableSet<YangStmtMapping> TOP_REUSED_DEF_SET = ImmutableSet.of(
- YangStmtMapping.TYPE,
- YangStmtMapping.TYPEDEF);
+ // FIXME: YANGTOOLS-694: we should take advantage of CopyPolicy
+ private static final ImmutableSet<? extends StatementDefinition> TOP_REUSED_DEF_SET = ImmutableSet.of(
+ YangStmtMapping.TYPE, YangStmtMapping.TYPEDEF);
+ private static final ImmutableSet<? extends StatementDefinition> DOCUMENTATION_STATEMENTS = ImmutableSet.of(
+ YangStmtMapping.DESCRIPTION, YangStmtMapping.REFERENCE, YangStmtMapping.STATUS);
private static void copyStatement(final Mutable<?, ?, ?> original,
final StatementContextBase<?, ?, ?> targetCtx, final QNameModule targetModule,
final Collection<Mutable<?, ?, ?>> buffer) {
+
+ // FIXME: YANGTOOLS-694: This method needs to be adjusted to account for RFC7950,
+ // https://tools.ietf.org/html/rfc7950#section-7.13, which states that:
+ //
+ // The effect of a "uses" reference to a grouping is that the nodes
+ // defined by the grouping are copied into the current schema tree and
+ // are then updated according to the "refine" and "augment" statements.
+ //
+ // This means that the statement that is about to be copied (and can be subjected to
+ // buildEffective() I think) is actually a SchemaTreeEffectiveStatement -- i.e. if it
+ // is not a SchemaTreeEffectiveStatement, it just cannot be added to target's tree and
+ // hence it should not be copied.
+
final StatementDefinition def = original.getPublicDefinition();
+ if (DOCUMENTATION_STATEMENTS.contains(def)) {
+ // We do not want to propagate description/reference/status statements, as they are the source grouping's
+ // documentation, not target statement's
+ return;
+ }
if (TOP_REUSED_DEF_SET.contains(def)) {
+ // a grouping's type/typedef statements are fully defined at the grouping, we want the same effective
+ // statement
buffer.add(original);
return;
}
- // Do not propagate uses, as their effects have been accounted for in effective statements
- // FIXME: YANGTOOLS-652: this check is different from InferredStatementContext. Why is that? We should express
- // a common condition in our own implementation of copyAsChildOf()
- if (!YangStmtMapping.USES.equals(def)) {
- original.copyAsChildOf(targetCtx, CopyType.ADDED_BY_USES, targetModule).ifPresent(buffer::add);
+ if (YangStmtMapping.USES.equals(def)) {
+ // Do not propagate uses, as their effects have been accounted for in effective statements
+ // FIXME: YANGTOOLS-652: this check is different from InferredStatementContext. Why is that? We should
+ // express a common condition in our own implementation of applyCopyPolicy()
+ // FIXME: YANGTOOLS-694: note that if the above is true, why are we propagating grouping statements?
+ return;
}
+ original.copyAsChildOf(targetCtx, CopyType.ADDED_BY_USES, targetModule).ifPresent(buffer::add);
}
private static QNameModule getNewQNameModule(final StmtContext<?, ?, ?> targetCtx,
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
-import com.google.common.annotations.Beta;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
}
return Optional.ofNullable(revision);
}
-
- /**
- * Determine if a specific statetement context is a child of a statement context which produces a grouping.
- *
- * @param stmt Statement to examine
- * @return True if parent context is that of a grouping.
- */
- @Beta
- public static boolean isChildOfGrouping(final StmtContext<?, ?, ?> stmt) {
- final StmtContext<?, ?, ?> parent = stmt.getParentContext();
- return parent != null && parent.getPublicDefinition() == YangStmtMapping.GROUPING;
- }
}