Bug 6867: Extend yang statement parser to support different yang versions
[yangtools.git] / yang / yang-model-api / src / main / java / org / opendaylight / yangtools / yang / model / api / YangStmtMapping.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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.model.api;
9
10 import com.google.common.annotations.Beta;
11 import com.google.common.base.Preconditions;
12 import javax.annotation.Nonnull;
13 import javax.annotation.Nullable;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.common.YangConstants;
16 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
17 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
18 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
19 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
20 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement;
24 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
25 import org.opendaylight.yangtools.yang.model.api.stmt.BitStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
27 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
31 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
32 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
34 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
35 import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement;
36 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement;
37 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement;
38 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
39 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
40 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
41 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
42 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
43 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
44 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
45 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
46 import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
47 import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
48 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
49 import org.opendaylight.yangtools.yang.model.api.stmt.LeafStatement;
50 import org.opendaylight.yangtools.yang.model.api.stmt.LengthStatement;
51 import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
52 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement;
53 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement;
54 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement;
55 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
56 import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
57 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
58 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
59 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
60 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement;
61 import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
62 import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
63 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
64 import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement;
65 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
66 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
67 import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement;
68 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
69 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
70 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement;
71 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
72 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
73 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
74 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
75 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
76 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
77 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
78 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
79 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
80 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
81 import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement;
82 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
83 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
84 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement;
85
86 /**
87  * Mapping for both RFC6020 and RFC7950 statements.
88  */
89 @Beta
90 public enum YangStmtMapping implements StatementDefinition {
91     ANYDATA(AnydataStatement.class, "anydata", "name"),
92     ANYXML(AnyxmlStatement.class, "anyxml", "name"),
93     ARGUMENT(ArgumentStatement.class, "argument", "name"),
94     AUGMENT(AugmentStatement.class, "augment", "target-node"),
95     BASE(BaseStatement.class, "base", "name"),
96     BELONGS_TO(BelongsToStatement.class, "belongs-to", "module"),
97     BIT(BitStatement.class, "bit", "name"),
98     CASE(CaseStatement.class, "case", "name"),
99     CHOICE(ChoiceStatement.class, "choice", "name"),
100     CONFIG(ConfigStatement.class, "config", "value"),
101     CONTACT(ContactStatement.class, "contact", "text", true),
102     CONTAINER(ContainerStatement.class, "container", "name"),
103     DEFAULT(DefaultStatement.class, "default", "value"),
104     DESCRIPTION(DescriptionStatement.class, "description", "text", true),
105     DEVIATE(DeviateStatement.class, "deviate", "value"),
106     DEVIATION(DeviationStatement.class, "deviation", "target-node"),
107     ENUM(EnumStatement.class, "enum", "name"),
108     ERROR_APP_TAG(ErrorAppTagStatement.class, "error-app-tag", "value"),
109     ERROR_MESSAGE(ErrorMessageStatement.class, "error-message", "value", true),
110     EXTENSION(ExtensionStatement.class, "extension", "name"),
111     FEATURE(FeatureStatement.class, "feature", "name"),
112     FRACTION_DIGITS(FractionDigitsStatement.class, "fraction-digits", "value"),
113     GROUPING(GroupingStatement.class, "grouping", "name"),
114     IDENTITY(IdentityStatement.class, "identity", "name"),
115     IF_FEATURE(IfFeatureStatement.class, "if-feature", "name"),
116     IMPORT(ImportStatement.class, "import", "module"),
117     INCLUDE(IncludeStatement.class, "include", "module"),
118     INPUT(InputStatement.class, "input"),
119     KEY(KeyStatement.class, "key", "value"),
120     LEAF(LeafStatement.class, "leaf", "name"),
121     LEAF_LIST(LeafListStatement.class, "leaf-list", "name"),
122     LENGTH(LengthStatement.class, "length", "value"),
123     LIST(ListStatement.class, "list", "name"),
124     MANDATORY(MandatoryStatement.class, "mandatory", "value"),
125     MAX_ELEMENTS(MaxElementsStatement.class, "max-elements", "value"),
126     MIN_ELEMENTS(MinElementsStatement.class, "min-elements", "value"),
127     MODULE(ModuleStatement.class, "module", "name"),
128     MUST(MustStatement.class, "must", "condition"),
129     NAMESPACE(NamespaceStatement.class, "namespace", "uri"),
130     NOTIFICATION(NotificationStatement.class, "notification", "name"),
131     ORDERED_BY(OrderedByStatement.class, "ordered-by", "value"),
132     ORGANIZATION(OrganizationStatement.class, "organization", "text", true),
133     OUTPUT(OutputStatement.class, "output"),
134     PATH(PathStatement.class, "path", "value"),
135     PATTERN(PatternStatement.class, "pattern", "value"),
136     POSITION(PositionStatement.class, "position", "value"),
137     PREFIX(PrefixStatement.class, "prefix", "value"),
138     PRESENCE(PresenceStatement.class, "presence", "value"),
139     RANGE(RangeStatement.class, "range", "value"),
140     REFERENCE(ReferenceStatement.class, "reference", "text", true),
141     REFINE(RefineStatement.class, "refine", "target-node"),
142     REQUIRE_INSTANCE(RequireInstanceStatement.class, "require-instance", "value"),
143     REVISION(RevisionStatement.class, "revision", "date"),
144     REVISION_DATE(RevisionDateStatement.class, "revision-date", "date"),
145     RPC(RpcStatement.class, "rpc", "name"),
146     STATUS(StatusStatement.class, "status", "value"),
147     SUBMODULE(SubmoduleStatement.class, "submodule", "name"),
148     TYPE(TypeStatement.class, "type", "name"),
149     TYPEDEF(TypedefStatement.class, "typedef", "name"),
150     UNIQUE(UniqueStatement.class, "unique", "tag"),
151     UNITS(UnitsStatement.class, "units", "name"),
152     USES(UsesStatement.class, "uses", "name"),
153     VALUE(ValueStatement.class, "value", "value"),
154     WHEN(WhenStatement.class, "when", "condition"),
155     YANG_VERSION(YangVersionStatement.class, "yang-version", "value"),
156     YIN_ELEMENT(YinElementStatement.class, "yin-element", "value");
157
158     private final Class<? extends DeclaredStatement<?>> type;
159     private final Class<? extends EffectiveStatement<?,?>> effectiveType;
160     private final QName name;
161     private final QName argument;
162     private final boolean yinElement;
163
164     YangStmtMapping(final Class<? extends DeclaredStatement<?>> clz, final String nameStr) {
165         type = Preconditions.checkNotNull(clz);
166         //FIXME: fill up effective type correctly
167         effectiveType = null;
168         name = yinQName(nameStr);
169         argument = null;
170         yinElement = false;
171     }
172
173     YangStmtMapping(final Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr) {
174         type = Preconditions.checkNotNull(clz);
175         //FIXME: fill up effective type correctly
176         effectiveType = null;
177         name = yinQName(nameStr);
178         argument = yinQName(argumentStr);
179         this.yinElement = false;
180     }
181
182     YangStmtMapping(final Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr,
183             final boolean yinElement) {
184         type = Preconditions.checkNotNull(clz);
185         //FIXME: fill up effective type correctly
186         effectiveType = null;
187         name = yinQName(nameStr);
188         argument = yinQName(argumentStr);
189         this.yinElement = yinElement;
190     }
191
192     @Nonnull private static QName yinQName(final String nameStr) {
193         return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
194     }
195
196     @Nonnull
197     @Override
198     public QName getStatementName() {
199         return name;
200     }
201
202     @Override
203     @Nullable public QName getArgumentName() {
204         return argument;
205     }
206
207     @Override
208     @Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
209         return type;
210     }
211
212     @Nonnull
213     @Override
214     public Class<? extends EffectiveStatement<?,?>> getEffectiveRepresentationClass() {
215         return effectiveType;
216     }
217
218     @Override
219     public boolean isArgumentYinElement() {
220         return yinElement;
221     }
222 }
223