Promote BaseStatementSupport to parser.spi.meta
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / deviation / DeviationStatementSupport.java
index d38acdf6de906606e0fb349c7201c6ed5576fe62..96833b667d6d1335d75380a2dea39c188072268e 100644 (file)
@@ -7,20 +7,26 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviation;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
 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.DeviationEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
 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.spi.source.ModuleCtxToModuleQName;
 
-public final class DeviationStatementSupport extends AbstractStatementSupport<SchemaNodeIdentifier, DeviationStatement,
-        EffectiveStatement<SchemaNodeIdentifier, DeviationStatement>> {
+public final class DeviationStatementSupport
+        extends AbstractStatementSupport<Absolute, DeviationStatement, DeviationEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
         .DEVIATION)
         .addOptional(YangStmtMapping.DESCRIPTION)
@@ -30,7 +36,7 @@ public final class DeviationStatementSupport extends AbstractStatementSupport<Sc
     private static final DeviationStatementSupport INSTANCE = new DeviationStatementSupport();
 
     private DeviationStatementSupport() {
-        super(YangStmtMapping.DEVIATION);
+        super(YangStmtMapping.DEVIATION, StatementPolicy.reject());
     }
 
     public static DeviationStatementSupport getInstance() {
@@ -38,37 +44,41 @@ public final class DeviationStatementSupport extends AbstractStatementSupport<Sc
     }
 
     @Override
-    public SchemaNodeIdentifier parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        return ArgumentUtils.nodeIdentifierFromPath(ctx, value);
+    public Absolute parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+        return ArgumentUtils.parseAbsoluteSchemaNodeIdentifier(ctx, value);
     }
 
     @Override
-    public DeviationStatement createDeclared(final StmtContext<SchemaNodeIdentifier, DeviationStatement, ?> ctx) {
-        return new DeviationStatementImpl(ctx);
+    public void onFullDefinitionDeclared(
+            final Mutable<Absolute, DeviationStatement, DeviationEffectiveStatement> ctx) {
+        final QNameModule currentModule = ctx.getFromNamespace(ModuleCtxToModuleQName.class, ctx.getRoot());
+        final QNameModule targetModule = Iterables.getLast(ctx.getArgument().getNodeIdentifiers()).getModule();
+
+        if (currentModule.equals(targetModule)) {
+            throw new InferenceException(ctx,
+                    "Deviation must not target the same module as the one it is defined in: %s", currentModule);
+        }
     }
 
     @Override
-    public EffectiveStatement<SchemaNodeIdentifier, DeviationStatement> createEffective(
-            final StmtContext<SchemaNodeIdentifier, DeviationStatement,
-            EffectiveStatement<SchemaNodeIdentifier, DeviationStatement>> ctx) {
-        return new DeviationEffectiveStatementImpl(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
     }
 
     @Override
-    public void onFullDefinitionDeclared(final StmtContext.Mutable<SchemaNodeIdentifier, DeviationStatement,
-            EffectiveStatement<SchemaNodeIdentifier, DeviationStatement>> ctx) {
-        final QNameModule currentModule = ctx.getFromNamespace(ModuleCtxToModuleQName.class,
-                ctx.getRoot());
-        final QNameModule targetModule = ctx.coerceStatementArgument().getLastComponent().getModule();
+    protected DeviationStatement createDeclared(final StmtContext<Absolute, DeviationStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new DeviationStatementImpl(ctx.getRawArgument(), ctx.getArgument(), substatements);
+    }
 
-        if (currentModule.equals(targetModule)) {
-            throw new InferenceException(ctx.getStatementSourceReference(),
-                    "Deviation must not target the same module as the one it is defined in: %s", currentModule);
-        }
+    @Override
+    protected DeviationStatement createEmptyDeclared(final StmtContext<Absolute, DeviationStatement, ?> ctx) {
+        return createDeclared(ctx, ImmutableList.of());
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+    protected DeviationEffectiveStatement createEffective(final Current<Absolute, DeviationStatement> stmt,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new DeviationEffectiveStatementImpl(stmt.declared(), substatements);
     }
 }
\ No newline at end of file