YANGTOOLS-706: split out rfc8040-model-api
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc8040 / 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.yang.parser.stmt.rfc8040;
9
10 import com.google.common.annotations.Beta;
11 import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
12 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
13 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
14 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
15 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
16 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
17 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
18 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.SupportedExtensionsMapping;
19
20 @Beta
21 public final class YangDataStatementSupport extends AbstractStatementSupport<String, YangDataStatement,
22         EffectiveStatement<String, YangDataStatement>> {
23     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(
24         SupportedExtensionsMapping.YANG_DATA)
25             .addMandatory(YangStmtMapping.CONTAINER)
26             .addOptional(YangStmtMapping.USES)
27             .build();
28     private static final YangDataStatementSupport INSTANCE = new YangDataStatementSupport();
29
30     private YangDataStatementSupport() {
31         super(SupportedExtensionsMapping.YANG_DATA);
32     }
33
34     public static YangDataStatementSupport getInstance() {
35         return INSTANCE;
36     }
37
38     @Override
39     protected SubstatementValidator getSubstatementValidator() {
40         return SUBSTATEMENT_VALIDATOR;
41     }
42
43     @Override
44     public String parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
45         return value;
46     }
47
48     @Override
49     public YangDataStatement createDeclared(final StmtContext<String, YangDataStatement, ?> ctx) {
50         return new YangDataStatementImpl(ctx);
51     }
52
53     @Override
54     public EffectiveStatement<String, YangDataStatement> createEffective(final StmtContext<String,
55             YangDataStatement, EffectiveStatement<String, YangDataStatement>> ctx) {
56         // in case of yang-data node we need to perform substatement validation at the point when we have
57         // effective substatement contexts already available - if the node has only a uses statement declared in it,
58         // one top-level container node may very well be added to the yang-data as an effective statement
59         SUBSTATEMENT_VALIDATOR.validate(ctx);
60         return new YangDataEffectiveStatementImpl(ctx);
61     }
62
63     @Override
64     public void onFullDefinitionDeclared(final Mutable<String, YangDataStatement,
65             EffectiveStatement<String, YangDataStatement>> ctx) {
66         // as per https://tools.ietf.org/html/rfc8040#section-8,
67         // yang-data is ignored unless it appears as a top-level statement
68         if (ctx.getParentContext().getParentContext() != null) {
69             ctx.setIsSupportedToBuildEffective(false);
70         }
71     }
72
73     @Override
74     public boolean isIgnoringIfFeatures() {
75         return true;
76     }
77
78     @Override
79     public boolean isIgnoringConfig() {
80         return true;
81     }
82 }