Merge branch 'master' of ../controller
[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.YangDataStatement;
12 import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatements;
13 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
14 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
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 extends AbstractStatementSupport<String, YangDataStatement,
24         EffectiveStatement<String, YangDataStatement>> {
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 EffectiveStatement<String, YangDataStatement> createEffective(final StmtContext<String,
73             YangDataStatement, EffectiveStatement<String, YangDataStatement>> 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,
83             EffectiveStatement<String, YangDataStatement>> ctx) {
84         // as per https://tools.ietf.org/html/rfc8040#section-8,
85         // yang-data is ignored unless it appears as a top-level statement
86         if (ctx.coerceParentContext().getParentContext() != null) {
87             ctx.setIsSupportedToBuildEffective(false);
88         }
89     }
90
91     @Override
92     public boolean isIgnoringIfFeatures() {
93         return true;
94     }
95
96     @Override
97     public boolean isIgnoringConfig() {
98         return true;
99     }
100 }