SupportedExtensions mapping is too central for what we want to achieve.
Split out yang-data StatementDefinition into its own model world, so
others can point to it without accessing parser internals.
Also co-locate the implementation of YangDataStatement with its support,
so they can be easily transported.
Change-Id: Ic7ddfed705da5a0e9e3b20eecb333bb69b3e831c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
--- /dev/null
+/*
+ * Copyright (c) 2017 Pantheon Technologies, 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.rfc8040.model.api;
+
+import com.google.common.collect.ImmutableList;
+import java.net.URI;
+import java.util.Collection;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.Revision;
+import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier;
+import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
+
+/**
+ * Constants associated with RFC8040.
+ *
+ * @author Robert Varga
+ */
+public class YangDataConstants {
+ private static final String MODULE_NAME = "ietf-restconf";
+ private static final URI MODULE_NAMESPACE = URI.create("urn:ietf:params:xml:ns:yang:ietf-restconf");
+ private static final Revision RFC8040_REVISION = Revision.of("2017-01-26");
+
+ /**
+ * Runtime RFC8040 identity.
+ */
+ public static final QNameModule RFC8040_MODULE = QNameModule.create(MODULE_NAMESPACE, RFC8040_REVISION).intern();
+
+ /**
+ * RFC8040 model source name.
+ */
+ public static final SourceIdentifier RFC8040_SOURCE = RevisionSourceIdentifier.create(MODULE_NAME,
+ RFC8040_REVISION);
+
+ /**
+ * Normative prefix to use when importing {@link #RFC8040_SOURCE}.
+ */
+ public static final String MODULE_PREFIX = "rc";
+
+ private YangDataConstants() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Return identifiers of all sources known to define the metadata extension.
+ *
+ * @return Collection of identifiers.
+ */
+ public static Collection<SourceIdentifier> knownModelSources() {
+ return ImmutableList.of(RFC8040_SOURCE);
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2017 Pantheon Technologies, 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.rfc8040.model.api;
+
+import static java.util.Objects.requireNonNull;
+
+import org.opendaylight.yangtools.yang.common.QName;
+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.meta.StatementDefinition;
+
+/**
+ * {@link StatementDefinition}s for statements defined by RFC8040.
+ *
+ * @author Robert Varga
+ */
+public enum YangDataStatements implements StatementDefinition {
+ YANG_DATA(QName.create(YangDataConstants.RFC8040_MODULE, "yang-data"), "name", YangDataStatement.class,
+ YangDataEffectiveStatement.class);
+
+ private final Class<? extends EffectiveStatement<?, ?>> effectiveRepresentation;
+ private final Class<? extends DeclaredStatement<?>> declaredRepresentation;
+ private final QName statementName;
+ private final QName argumentName;
+
+ YangDataStatements(final QName statementName, final String argumentName,
+ final Class<? extends DeclaredStatement<?>> declaredRepresentation,
+ final Class<? extends EffectiveStatement<?, ?>> effectiveRepresentation) {
+ this.statementName = statementName.intern();
+ this.argumentName = QName.create(statementName, argumentName);
+ this.declaredRepresentation = requireNonNull(declaredRepresentation);
+ this.effectiveRepresentation = requireNonNull(effectiveRepresentation);
+ }
+
+ @Override
+ public QName getArgumentName() {
+ return argumentName;
+ }
+
+ @Override
+ public boolean isArgumentYinElement() {
+ return true;
+ }
+
+ @Override
+ public QName getStatementName() {
+ return statementName;
+ }
+
+ @Override
+ public Class<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
+ return effectiveRepresentation;
+ }
+
+ @Override
+ public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
+ return declaredRepresentation;
+ }
+}
import com.google.common.annotations.Beta;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
-import org.opendaylight.yangtools.rfc8040.model.api.YangDataEffectiveStatement;
-import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
"anyxml-schema-location", "target-node", false),
OPENCONFIG_VERSION("http://openconfig.net/yang/openconfig-ext",
OpenconfigVersionStatement.class, OpenconfigVersionEffectiveStatement.class,
- "openconfig-version", "semver", false),
- YANG_DATA("urn:ietf:params:xml:ns:yang:ietf-restconf", "2017-01-26", YangDataStatement.class,
- YangDataEffectiveStatement.class, "yang-data", "name", true);
+ "openconfig-version", "semver", false);
private final Class<? extends DeclaredStatement<?>> type;
private final Class<? extends EffectiveStatement<?, ?>> effectiveType;
+++ /dev/null
-/*
- * Copyright (c) 2017 Pantheon Technologies 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.stmt.rfc8040;
-
-import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-
-/**
- * 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 AbstractDeclaredStatement<String> implements YangDataStatement {
- YangDataStatementImpl(final StmtContext<String, YangDataStatement, ?> ctx) {
- super(ctx);
- }
-
- @Override
- public String getArgument() {
- return argument();
- }
-}
import com.google.common.annotations.Beta;
import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
+import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatements;
import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
+import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
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.SubstatementValidator;
-import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.SupportedExtensionsMapping;
@Beta
public final class YangDataStatementSupport extends AbstractStatementSupport<String, YangDataStatement,
EffectiveStatement<String, YangDataStatement>> {
- private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(
- SupportedExtensionsMapping.YANG_DATA)
- .addMandatory(YangStmtMapping.CONTAINER)
- .addOptional(YangStmtMapping.USES)
- .build();
- private static final YangDataStatementSupport INSTANCE = new YangDataStatementSupport();
+ /**
+ * Declared statement representation of 'yang-data' extension defined in
+ * <a href="https://tools.ietf.org/html/rfc8040#section-8">RFC 8040</a>.
+ */
+ private static final class Declared extends AbstractDeclaredStatement<String> implements YangDataStatement {
+ Declared(final StmtContext<String, YangDataStatement, ?> ctx) {
+ super(ctx);
+ }
+
+ @Override
+ public String getArgument() {
+ return argument();
+ }
+ }
+
+ private static final YangDataStatementSupport INSTANCE = new YangDataStatementSupport(YangDataStatements.YANG_DATA);
+
+ private final SubstatementValidator validator;
- private YangDataStatementSupport() {
- super(SupportedExtensionsMapping.YANG_DATA);
+ private YangDataStatementSupport(final StatementDefinition definition) {
+ super(definition);
+ validator = SubstatementValidator.builder(definition)
+ .addMandatory(YangStmtMapping.CONTAINER)
+ .addOptional(YangStmtMapping.USES)
+ .build();
}
public static YangDataStatementSupport getInstance() {
@Override
protected SubstatementValidator getSubstatementValidator() {
- return SUBSTATEMENT_VALIDATOR;
+ return validator;
}
@Override
@Override
public YangDataStatement createDeclared(final StmtContext<String, YangDataStatement, ?> ctx) {
- return new YangDataStatementImpl(ctx);
+ return new Declared(ctx);
}
@Override
// in case of yang-data node we need to perform substatement validation at the point when we have
// effective substatement contexts already available - if the node has only a uses statement declared in it,
// one top-level container node may very well be added to the yang-data as an effective statement
- SUBSTATEMENT_VALIDATOR.validate(ctx);
+ validator.validate(ctx);
return new YangDataEffectiveStatementImpl(ctx);
}