YANGTOOLS-706: separate out yang-data StametementDefinition 44/65144/9
authorRobert Varga <robert.varga@pantheon.tech>
Sat, 4 Nov 2017 15:44:58 +0000 (16:44 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 8 Nov 2017 10:24:41 +0000 (11:24 +0100)
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>
yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataConstants.java [new file with mode: 0644]
yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataStatements.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SupportedExtensionsMapping.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc8040/YangDataStatementImpl.java [deleted file]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc8040/YangDataStatementSupport.java

diff --git a/yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataConstants.java b/yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataConstants.java
new file mode 100644 (file)
index 0000000..13f52db
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * 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);
+    }
+}
diff --git a/yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataStatements.java b/yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataStatements.java
new file mode 100644 (file)
index 0000000..56f166a
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * 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;
+    }
+}
index 34524d07741d80ee8883e9952a5e64885d52e734..9d24c2f7d9b40f9bb9b2845839e14d69c3dadcd2 100644 (file)
@@ -12,8 +12,6 @@ import static java.util.Objects.requireNonNull;
 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;
@@ -30,9 +28,7 @@ public enum SupportedExtensionsMapping implements StatementDefinition {
         "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;
diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc8040/YangDataStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc8040/YangDataStatementImpl.java
deleted file mode 100644 (file)
index 3d2b1b0..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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();
-    }
-}
index 82f2051c3608f4775efac7a1a12facc7e2eb6152..1f4588089edb1ab3258e4a2be8d8e4abe0e5f746 100644 (file)
@@ -9,26 +9,44 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc8040;
 
 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() {
@@ -37,7 +55,7 @@ public final class YangDataStatementSupport extends AbstractStatementSupport<Str
 
     @Override
     protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+        return validator;
     }
 
     @Override
@@ -47,7 +65,7 @@ public final class YangDataStatementSupport extends AbstractStatementSupport<Str
 
     @Override
     public YangDataStatement createDeclared(final StmtContext<String, YangDataStatement, ?> ctx) {
-        return new YangDataStatementImpl(ctx);
+        return new Declared(ctx);
     }
 
     @Override
@@ -56,7 +74,7 @@ public final class YangDataStatementSupport extends AbstractStatementSupport<Str
         // 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);
     }