Split out yang-model-ri
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / feature / FeatureStatementSupport.java
index 75d4b65d18ec3476d4c2f308bfeddcd2491fdf43..925ac0149951e10fd05ee7c739f62943b3310cdc 100644 (file)
@@ -7,17 +7,28 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.feature;
 
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
+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.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.FeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder;
+import org.opendaylight.yangtools.yang.parser.spi.FeatureNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
 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 FeatureStatementSupport
-        extends AbstractQNameStatementSupport<FeatureStatement, EffectiveStatement<QName, FeatureStatement>> {
+        extends AbstractQNameStatementSupport<FeatureStatement, FeatureEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(
         YangStmtMapping.FEATURE)
         .addOptional(YangStmtMapping.DESCRIPTION)
@@ -25,30 +36,56 @@ public final class FeatureStatementSupport
         .addOptional(YangStmtMapping.STATUS)
         .addOptional(YangStmtMapping.REFERENCE)
         .build();
+    private static final FeatureStatementSupport INSTANCE = new FeatureStatementSupport();
+    private static final int EMPTY_EFFECTIVE_FLAGS = new FlagsBuilder().setStatus(Status.CURRENT).toFlags();
 
-    public FeatureStatementSupport() {
-        super(YangStmtMapping.FEATURE);
+    private FeatureStatementSupport() {
+        super(YangStmtMapping.FEATURE, StatementPolicy.reject());
     }
 
-    @Override
-    public QName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        return StmtContextUtils.qnameFromArgument(ctx, value);
+    public static FeatureStatementSupport getInstance() {
+        return INSTANCE;
     }
 
     @Override
-    public FeatureStatement createDeclared(
-            final StmtContext<QName, FeatureStatement, ?> ctx) {
-        return new FeatureStatementImpl(ctx);
+    public QName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+        return StmtContextUtils.parseIdentifier(ctx, value);
     }
 
     @Override
-    public EffectiveStatement<QName, FeatureStatement> createEffective(
-            final StmtContext<QName, FeatureStatement, EffectiveStatement<QName, FeatureStatement>> ctx) {
-        return new FeatureEffectiveStatementImpl(ctx);
+    public void onFullDefinitionDeclared(final Mutable<QName, FeatureStatement, FeatureEffectiveStatement> stmt) {
+        super.onFullDefinitionDeclared(stmt);
+        stmt.addContext(FeatureNamespace.class, stmt.getArgument(), stmt);
     }
 
     @Override
     protected SubstatementValidator getSubstatementValidator() {
         return SUBSTATEMENT_VALIDATOR;
     }
+
+    @Override
+    protected FeatureStatement createDeclared(final StmtContext<QName, FeatureStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return DeclaredStatements.createFeature(ctx.getArgument(), substatements);
+    }
+
+    @Override
+    protected FeatureStatement createEmptyDeclared(@NonNull final StmtContext<QName, FeatureStatement, ?> ctx) {
+        return DeclaredStatements.createFeature(ctx.getArgument());
+    }
+
+    @Override
+    protected FeatureEffectiveStatement createEffective(final Current<QName, FeatureStatement> stmt,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return substatements.isEmpty()
+            ? new EmptyFeatureEffectiveStatement(stmt.declared(), stmt.effectivePath(), EMPTY_EFFECTIVE_FLAGS)
+                : new RegularFeatureEffectiveStatement(stmt.declared(), stmt.effectivePath(),
+                    computeFlags(substatements), substatements);
+    }
+
+    private static int computeFlags(final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new FlagsBuilder()
+                .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
+                .toFlags();
+    }
 }
\ No newline at end of file