*/
package org.opendaylight.yangtools.rfc8040.model.api;
-import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.common.YangDataName;
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeAwareEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.UnknownEffectiveStatement;
* Effective statement representation of 'yang-data' extension defined in
* <a href="https://tools.ietf.org/html/rfc8040#section-8">RFC 8040</a>.
*/
-@Beta
-public interface YangDataEffectiveStatement extends UnknownEffectiveStatement<String, YangDataStatement>,
- DataTreeAwareEffectiveStatement<String, YangDataStatement> {
+public interface YangDataEffectiveStatement extends UnknownEffectiveStatement<YangDataName, YangDataStatement>,
+ DataTreeAwareEffectiveStatement<YangDataName, YangDataStatement> {
@Override
default StatementDefinition statementDefinition() {
return YangDataStatements.YANG_DATA;
*/
package org.opendaylight.yangtools.rfc8040.model.api;
-import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.common.YangDataName;
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
* Declared statement representation of 'yang-data' extension defined in
* <a href="https://tools.ietf.org/html/rfc8040#section-8">RFC 8040</a>.
*/
-@Beta
-public interface YangDataStatement extends UnknownStatement<String> {
+public interface YangDataStatement extends UnknownStatement<YangDataName> {
@Override
default StatementDefinition statementDefinition() {
return YangDataStatements.YANG_DATA;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
+import org.opendaylight.yangtools.yang.common.YangDataName;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference;
/**
* Lookup a {@code rc:yang-data} by the module namespace where it is defined and its template name.
*
- * @param namespace Module namespace in which to lookup the template
* @param name Template name
* @return Resolved yang-data
- * @throws NullPointerException if any argument is null
+ * @throws NullPointerException if any argument is {@code null}
* @throws IllegalArgumentException if the corresponding yang-data cannot be found
* @throws IllegalStateException if this stack is not empty
*/
- public @NonNull YangDataEffectiveStatement enterYangData(final QNameModule namespace, final String name) {
+ public @NonNull YangDataEffectiveStatement enterYangData(final YangDataName name) {
final EffectiveStatement<?, ?> parent = deque.peekLast();
checkState(parent == null, "Cannot lookup yang-data in a non-empty stack");
- final String templateName = requireNonNull(name);
- final ModuleEffectiveStatement module = effectiveModel.getModuleStatements().get(requireNonNull(namespace));
+ final var checkedName = requireNonNull(name);
+ final var namespace = name.module();
+ final ModuleEffectiveStatement module = effectiveModel.getModuleStatements().get(namespace);
checkArgument(module != null, "Module for %s not found", namespace);
final YangDataEffectiveStatement ret = module.streamEffectiveSubstatements(YangDataEffectiveStatement.class)
- .filter(stmt -> templateName.equals(stmt.argument()))
+ .filter(stmt -> checkedName.equals(stmt.argument()))
.findFirst()
.orElseThrow(
- () -> new IllegalArgumentException("yang-data " + templateName + " not present in " + namespace));
+ () -> new IllegalArgumentException("yang-data " + checkedName.name() + " not present in " + namespace));
deque.addLast(ret);
currentModule = module;
return ret;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.Revision;
import org.opendaylight.yangtools.yang.common.XMLNamespace;
+import org.opendaylight.yangtools.yang.common.YangDataName;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
@Test
public void testEnterYangData() {
- assertNotNull(stack.enterYangData(RESTCONF, "yang-api"));
+ assertNotNull(stack.enterYangData(new YangDataName(RESTCONF, "yang-api")));
assertNotNull(stack.enterDataTree(QName.create(RESTCONF, "restconf")));
}
@Test
public void testEnterYangDataNegative() {
- Exception ex = assertThrows(IllegalArgumentException.class, () -> stack.enterYangData(RESTCONF, "bad-name"));
+ Exception ex = assertThrows(IllegalArgumentException.class,
+ () -> stack.enterYangData(new YangDataName(RESTCONF, "bad-name")));
assertEquals("yang-data bad-name not present in " + RESTCONF, ex.getMessage());
- ex = assertThrows(IllegalArgumentException.class, () -> stack.enterYangData(BAD_MODULE, "whatever"));
+ ex = assertThrows(IllegalArgumentException.class,
+ () -> stack.enterYangData(new YangDataName(BAD_MODULE, "whatever")));
assertEquals("Module for " + BAD_MODULE + " not found", ex.getMessage());
assertNotNull(stack.enterGrouping(QName.create(RESTCONF, "errors")));
- ex = assertThrows(IllegalStateException.class, () -> stack.enterYangData(RESTCONF, "yang-api"));
+ ex = assertThrows(IllegalStateException.class,
+ () -> stack.enterYangData(new YangDataName(RESTCONF, "yang-api")));
assertEquals("Cannot lookup yang-data in a non-empty stack", ex.getMessage());
}
}
package org.opendaylight.yangtools.rfc8040.parser;
import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
+import org.opendaylight.yangtools.yang.common.YangDataName;
import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference;
import org.opendaylight.yangtools.yang.model.spi.meta.AbstractRefStatement;
-final class RefYangDataStatement extends AbstractRefStatement<String, YangDataStatement> implements YangDataStatement {
+final class RefYangDataStatement extends AbstractRefStatement<YangDataName, YangDataStatement>
+ implements YangDataStatement {
RefYangDataStatement(final YangDataStatement delegate, final DeclarationReference ref) {
super(delegate, ref);
}
import org.opendaylight.yangtools.rfc8040.model.api.YangDataSchemaNode;
import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.YangDataName;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeAwareEffectiveStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
@Beta
-final class YangDataEffectiveStatementImpl extends AbstractEffectiveUnknownSchmemaNode<String, YangDataStatement>
- implements YangDataEffectiveStatement, YangDataSchemaNode, DataNodeContainerMixin<String, YangDataStatement> {
+final class YangDataEffectiveStatementImpl
+ extends AbstractEffectiveUnknownSchmemaNode<YangDataName, YangDataStatement>
+ implements YangDataEffectiveStatement, YangDataSchemaNode,
+ DataNodeContainerMixin<YangDataName, YangDataStatement> {
private final @NonNull DataSchemaNode child;
- YangDataEffectiveStatementImpl(final Current<String, YangDataStatement> stmt,
+ YangDataEffectiveStatementImpl(final Current<YangDataName, YangDataStatement> stmt,
final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final DataSchemaNode child) {
super(stmt.declared(), stmt.argument(), stmt.history(), substatements);
this.child = requireNonNull(child);
}
@Override
- public Optional<SchemaTreeEffectiveStatement<?>> findSchemaTreeNode(@NonNull QName qname) {
+ public Optional<SchemaTreeEffectiveStatement<?>> findSchemaTreeNode(final QName qname) {
return qname.equals(child.getQName()) ? (Optional) Optional.of(child) : Optional.empty();
}
}
import com.google.common.collect.ImmutableList;
import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
+import org.opendaylight.yangtools.yang.common.YangDataName;
import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
-import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithRawStringArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithArgument.WithSubstatements;
/**
* Declared statement representation of 'yang-data' extension defined in
* <a href="https://tools.ietf.org/html/rfc8040#section-8">RFC 8040</a>.
*/
-final class YangDataStatementImpl extends WithSubstatements implements YangDataStatement {
- YangDataStatementImpl(final String rawArgument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
- super(rawArgument, substatements);
+final class YangDataStatementImpl extends WithSubstatements<YangDataName> implements YangDataStatement {
+ YangDataStatementImpl(final YangDataName argument,
+ final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+ super(argument.name(), argument, substatements);
}
}
\ No newline at end of file
import static com.google.common.base.Verify.verify;
import com.google.common.annotations.Beta;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import java.util.stream.Collectors;
+import org.opendaylight.yangtools.rfc8040.model.api.YangDataConstants;
import org.opendaylight.yangtools.rfc8040.model.api.YangDataEffectiveStatement;
import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatements;
+import org.opendaylight.yangtools.yang.common.YangDataName;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.UsesEffectiveStatement;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.BoundStmtCtx;
import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
import org.opendaylight.yangtools.yang.parser.spi.meta.InvalidSubstatementException;
import org.opendaylight.yangtools.yang.parser.spi.meta.MissingSubstatementException;
+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;
@Beta
public final class YangDataStatementSupport
- extends AbstractStringStatementSupport<YangDataStatement, YangDataEffectiveStatement> {
+ extends AbstractStatementSupport<YangDataName, YangDataStatement, YangDataEffectiveStatement> {
// As per RFC8040 page 81:
//
// The substatements of this extension MUST follow the
.addAny(YangStmtMapping.USES)
.build();
+ @VisibleForTesting
+ static final YangDataName YANG_API = new YangDataName(YangDataConstants.RFC8040_MODULE, "yang-api");
+
public YangDataStatementSupport(final YangParserConfiguration config) {
super(YangDataStatements.YANG_DATA, StatementPolicy.reject(), config, VALIDATOR);
}
@Override
- public void onStatementAdded(final Mutable<String, YangDataStatement, YangDataEffectiveStatement> ctx) {
+ public YangDataName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+ try {
+ return new YangDataName(StmtContextUtils.getModuleQName(ctx.getRoot()), value);
+ } catch (IllegalArgumentException e) {
+ throw new SourceException(ctx, e, "Invalid yang-data argument %s", value);
+ }
+ }
+
+ @Override
+ public void onStatementAdded(final Mutable<YangDataName, YangDataStatement, YangDataEffectiveStatement> ctx) {
// as per https://tools.ietf.org/html/rfc8040#section-8,
// yang-data is ignored unless it appears as a top-level statement
if (ctx.coerceParentContext().getParentContext() != null) {
}
@Override
- public void onFullDefinitionDeclared(final Mutable<String, YangDataStatement, YangDataEffectiveStatement> ctx) {
+ public void onFullDefinitionDeclared(
+ final Mutable<YangDataName, YangDataStatement, YangDataEffectiveStatement> ctx) {
// If we are declared in an illegal place, this becomes a no-op
if (!ctx.isSupportedToBuildEffective()) {
return;
// }
//
// If we find it, we hook an inference action which performs the next step when the module is fully declared.
- if ("yang-api".equals(ctx.argument())) {
+ if (YANG_API.equals(ctx.getArgument())) {
final var stmts = ctx.declaredSubstatements();
if (stmts.size() == 1) {
final var stmt = stmts.iterator().next();
}
@Override
- protected YangDataStatement createDeclared(final BoundStmtCtx<String> ctx,
+ protected YangDataStatement createDeclared(final BoundStmtCtx<YangDataName> ctx,
final ImmutableList<DeclaredStatement<?>> substatements) {
- return new YangDataStatementImpl(ctx.getRawArgument(), substatements);
+ return new YangDataStatementImpl(ctx.getArgument(), substatements);
}
@Override
}
@Override
- protected YangDataEffectiveStatement createEffective(final Current<String, YangDataStatement> stmt,
+ protected YangDataEffectiveStatement createEffective(final Current<YangDataName, YangDataStatement> stmt,
final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
// RFC8040 page 80 requires that:
// It MUST contain data definition statements
.findModuleStatement(YangDataConstants.RFC8040_MODULE)
.orElseThrow()
.streamEffectiveSubstatements(YangDataEffectiveStatement.class)
- .filter(stmt -> "yang-api".equals(stmt.argument()))
+ .filter(stmt -> YangDataStatementSupport.YANG_API.equals(stmt.argument()))
.findAny()
.orElseThrow()
.findDataTreeNode(QName.create(YangDataConstants.RFC8040_MODULE, "restconf"))