Fix YangDataStatementSupport declaration
[yangtools.git] / yang / rfc8040-parser-support / src / main / java / org / opendaylight / yangtools / rfc8040 / parser / YangDataStatementSupport.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.rfc8040.parser;
9
10 import com.google.common.annotations.Beta;
11 import org.opendaylight.yangtools.rfc8040.model.api.YangDataEffectiveStatement;
12 import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
13 import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatements;
14 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
15 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
16 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
17 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
18 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
19 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
20 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
21
22 @Beta
23 public final class YangDataStatementSupport
24         extends AbstractStatementSupport<String, YangDataStatement, YangDataEffectiveStatement> {
25     /**
26      * Declared statement representation of 'yang-data' extension defined in
27      * <a href="https://tools.ietf.org/html/rfc8040#section-8">RFC 8040</a>.
28      */
29     private static final class Declared extends AbstractDeclaredStatement<String> implements YangDataStatement {
30         Declared(final StmtContext<String, YangDataStatement, ?> ctx) {
31             super(ctx);
32         }
33
34         @Override
35         public String getArgument() {
36             return argument();
37         }
38     }
39
40     private static final YangDataStatementSupport INSTANCE = new YangDataStatementSupport(YangDataStatements.YANG_DATA);
41
42     private final SubstatementValidator validator;
43
44     private YangDataStatementSupport(final StatementDefinition definition) {
45         super(definition);
46         validator = SubstatementValidator.builder(definition)
47                 .addMandatory(YangStmtMapping.CONTAINER)
48                 .addOptional(YangStmtMapping.USES)
49                 .build();
50     }
51
52     public static YangDataStatementSupport getInstance() {
53         return INSTANCE;
54     }
55
56     @Override
57     protected SubstatementValidator getSubstatementValidator() {
58         return validator;
59     }
60
61     @Override
62     public String parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
63         return value;
64     }
65
66     @Override
67     public YangDataStatement createDeclared(final StmtContext<String, YangDataStatement, ?> ctx) {
68         return new Declared(ctx);
69     }
70
71     @Override
72     public YangDataEffectiveStatement createEffective(
73             final StmtContext<String, YangDataStatement, YangDataEffectiveStatement> ctx) {
74         // in case of yang-data node we need to perform substatement validation at the point when we have
75         // effective substatement contexts already available - if the node has only a uses statement declared in it,
76         // one top-level container node may very well be added to the yang-data as an effective statement
77         validator.validate(ctx);
78         return new YangDataEffectiveStatementImpl(ctx);
79     }
80
81     @Override
82     public void onFullDefinitionDeclared(final Mutable<String, YangDataStatement, YangDataEffectiveStatement> ctx) {
83         // as per https://tools.ietf.org/html/rfc8040#section-8,
84         // yang-data is ignored unless it appears as a top-level statement
85         if (ctx.coerceParentContext().getParentContext() != null) {
86             ctx.setIsSupportedToBuildEffective(false);
87         }
88     }
89
90     @Override
91     public boolean isIgnoringIfFeatures() {
92         return true;
93     }
94
95     @Override
96     public boolean isIgnoringConfig() {
97         return true;
98     }
99 }