Migrate StatementDefinition @Nullable
[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 static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.Beta;
13 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
14 import org.eclipse.jdt.annotation.NonNullByDefault;
15 import org.eclipse.jdt.annotation.Nullable;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.common.YangConstants;
18 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
19 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
20 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
21 import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement;
24 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
25 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
27 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentEffectiveStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
31 import org.opendaylight.yangtools.yang.model.api.stmt.BaseEffectiveStatement;
32 import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToEffectiveStatement;
34 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
35 import org.opendaylight.yangtools.yang.model.api.stmt.BitEffectiveStatement;
36 import org.opendaylight.yangtools.yang.model.api.stmt.BitStatement;
37 import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
38 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
39 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
40 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
41 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigEffectiveStatement;
42 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
43 import org.opendaylight.yangtools.yang.model.api.stmt.ContactEffectiveStatement;
44 import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement;
45 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
46 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
47 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
48 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
49 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement;
50 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
51 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement;
52 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
53 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationEffectiveStatement;
54 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
55 import org.opendaylight.yangtools.yang.model.api.stmt.EnumEffectiveStatement;
56 import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement;
57 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagEffectiveStatement;
58 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement;
59 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageEffectiveStatement;
60 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement;
61 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionEffectiveStatement;
62 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
63 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureEffectiveStatement;
64 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
65 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsEffectiveStatement;
66 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
67 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
68 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
69 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityEffectiveStatement;
70 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
71 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureEffectiveStatement;
72 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
73 import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement;
74 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
75 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeEffectiveStatement;
76 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
77 import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
78 import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
79 import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement;
80 import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
81 import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
82 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement;
83 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
84 import org.opendaylight.yangtools.yang.model.api.stmt.LeafStatement;
85 import org.opendaylight.yangtools.yang.model.api.stmt.LengthEffectiveStatement;
86 import org.opendaylight.yangtools.yang.model.api.stmt.LengthStatement;
87 import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
88 import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
89 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
90 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement;
91 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsEffectiveStatement;
92 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement;
93 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement;
94 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement;
95 import org.opendaylight.yangtools.yang.model.api.stmt.ModifierEffectiveStatement;
96 import org.opendaylight.yangtools.yang.model.api.stmt.ModifierStatement;
97 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
98 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
99 import org.opendaylight.yangtools.yang.model.api.stmt.MustEffectiveStatement;
100 import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
101 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceEffectiveStatement;
102 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
103 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
104 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
105 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByEffectiveStatement;
106 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
107 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationEffectiveStatement;
108 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement;
109 import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
110 import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
111 import org.opendaylight.yangtools.yang.model.api.stmt.PathEffectiveStatement;
112 import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
113 import org.opendaylight.yangtools.yang.model.api.stmt.PatternEffectiveStatement;
114 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
115 import org.opendaylight.yangtools.yang.model.api.stmt.PositionEffectiveStatement;
116 import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement;
117 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement;
118 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
119 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceEffectiveStatement;
120 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
121 import org.opendaylight.yangtools.yang.model.api.stmt.RangeEffectiveStatement;
122 import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement;
123 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
124 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
125 import org.opendaylight.yangtools.yang.model.api.stmt.RefineEffectiveStatement;
126 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
127 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveStatement;
128 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement;
129 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateEffectiveStatement;
130 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
131 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionEffectiveStatement;
132 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
133 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
134 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
135 import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
136 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
137 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
138 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
139 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
140 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
141 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
142 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
143 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement;
144 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
145 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
146 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
147 import org.opendaylight.yangtools.yang.model.api.stmt.UsesEffectiveStatement;
148 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
149 import org.opendaylight.yangtools.yang.model.api.stmt.ValueEffectiveStatement;
150 import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement;
151 import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement;
152 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
153 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionEffectiveStatement;
154 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
155 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementEffectiveStatement;
156 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement;
157
158 /**
159  * Mapping for both RFC6020 and RFC7950 statements.
160  */
161 @Beta
162 @NonNullByDefault
163 public enum YangStmtMapping implements StatementDefinition {
164     ACTION(ActionStatement.class, ActionEffectiveStatement.class, "action", "name"),
165     ANYDATA(AnydataStatement.class, AnydataEffectiveStatement.class, "anydata", "name"),
166     ANYXML(AnyxmlStatement.class, AnyxmlEffectiveStatement.class, "anyxml", "name"),
167     ARGUMENT(ArgumentStatement.class, ArgumentEffectiveStatement.class, "argument", "name"),
168     AUGMENT(AugmentStatement.class, AugmentEffectiveStatement.class, "augment", "target-node"),
169     BASE(BaseStatement.class, BaseEffectiveStatement.class, "base", "name"),
170     BELONGS_TO(BelongsToStatement.class, BelongsToEffectiveStatement.class, "belongs-to", "module"),
171     BIT(BitStatement.class, BitEffectiveStatement.class, "bit", "name"),
172     CASE(CaseStatement.class, CaseEffectiveStatement.class, "case", "name"),
173     CHOICE(ChoiceStatement.class, ChoiceEffectiveStatement.class, "choice", "name"),
174     CONFIG(ConfigStatement.class, ConfigEffectiveStatement.class, "config", "value"),
175     CONTACT(ContactStatement.class, ContactEffectiveStatement.class, "contact", "text", true),
176     CONTAINER(ContainerStatement.class, ContainerEffectiveStatement.class, "container", "name"),
177     DEFAULT(DefaultStatement.class, DefaultEffectiveStatement.class, "default", "value"),
178     DESCRIPTION(DescriptionStatement.class, DescriptionEffectiveStatement.class, "description", "text", true),
179     DEVIATE(DeviateStatement.class, DeviateEffectiveStatement.class, "deviate", "value"),
180     DEVIATION(DeviationStatement.class, DeviationEffectiveStatement.class, "deviation", "target-node"),
181     ENUM(EnumStatement.class, EnumEffectiveStatement.class, "enum", "name"),
182     ERROR_APP_TAG(ErrorAppTagStatement.class, ErrorAppTagEffectiveStatement.class, "error-app-tag", "value"),
183     ERROR_MESSAGE(ErrorMessageStatement.class, ErrorMessageEffectiveStatement.class, "error-message", "value", true),
184     EXTENSION(ExtensionStatement.class, ExtensionEffectiveStatement.class, "extension", "name"),
185     FEATURE(FeatureStatement.class, FeatureEffectiveStatement.class, "feature", "name"),
186     FRACTION_DIGITS(FractionDigitsStatement.class, FractionDigitsEffectiveStatement.class, "fraction-digits", "value"),
187     GROUPING(GroupingStatement.class, GroupingEffectiveStatement.class, "grouping", "name"),
188     IDENTITY(IdentityStatement.class, IdentityEffectiveStatement.class, "identity", "name"),
189     IF_FEATURE(IfFeatureStatement.class, IfFeatureEffectiveStatement.class, "if-feature", "name"),
190     IMPORT(ImportStatement.class, ImportEffectiveStatement.class, "import", "module"),
191     INCLUDE(IncludeStatement.class, IncludeEffectiveStatement.class, "include", "module"),
192     INPUT(InputStatement.class, InputEffectiveStatement.class, "input"),
193     KEY(KeyStatement.class, KeyEffectiveStatement.class, "key", "value"),
194     LEAF(LeafStatement.class, LeafEffectiveStatement.class, "leaf", "name"),
195     LEAF_LIST(LeafListStatement.class, LeafListEffectiveStatement.class, "leaf-list", "name"),
196     LENGTH(LengthStatement.class, LengthEffectiveStatement.class, "length", "value"),
197     LIST(ListStatement.class, ListEffectiveStatement.class, "list", "name"),
198     MANDATORY(MandatoryStatement.class, MandatoryEffectiveStatement.class, "mandatory", "value"),
199     MAX_ELEMENTS(MaxElementsStatement.class, MaxElementsEffectiveStatement.class, "max-elements", "value"),
200     MIN_ELEMENTS(MinElementsStatement.class, MinElementsEffectiveStatement.class, "min-elements", "value"),
201     MODIFIER(ModifierStatement.class, ModifierEffectiveStatement.class, "modifier", "value"),
202     MODULE(ModuleStatement.class, ModuleEffectiveStatement.class, "module", "name"),
203     MUST(MustStatement.class, MustEffectiveStatement.class, "must", "condition"),
204     NAMESPACE(NamespaceStatement.class, NamespaceEffectiveStatement.class, "namespace", "uri"),
205     NOTIFICATION(NotificationStatement.class, NotificationEffectiveStatement.class, "notification", "name"),
206     ORDERED_BY(OrderedByStatement.class, OrderedByEffectiveStatement.class, "ordered-by", "value"),
207     ORGANIZATION(OrganizationStatement.class, OrganizationEffectiveStatement.class, "organization", "text", true),
208     OUTPUT(OutputStatement.class, OutputEffectiveStatement.class, "output"),
209     PATH(PathStatement.class, PathEffectiveStatement.class, "path", "value"),
210     PATTERN(PatternStatement.class, PatternEffectiveStatement.class, "pattern", "value"),
211     POSITION(PositionStatement.class, PositionEffectiveStatement.class, "position", "value"),
212     PREFIX(PrefixStatement.class, PrefixEffectiveStatement.class, "prefix", "value"),
213     PRESENCE(PresenceStatement.class, PresenceEffectiveStatement.class, "presence", "value"),
214     RANGE(RangeStatement.class, RangeEffectiveStatement.class, "range", "value"),
215     REFERENCE(ReferenceStatement.class, ReferenceEffectiveStatement.class, "reference", "text", true),
216     REFINE(RefineStatement.class, RefineEffectiveStatement.class, "refine", "target-node"),
217     REQUIRE_INSTANCE(RequireInstanceStatement.class, RequireInstanceEffectiveStatement.class, "require-instance",
218         "value"),
219     REVISION(RevisionStatement.class, RevisionEffectiveStatement.class, "revision", "date"),
220     REVISION_DATE(RevisionDateStatement.class, RevisionDateEffectiveStatement.class, "revision-date", "date"),
221     RPC(RpcStatement.class, RpcEffectiveStatement.class, "rpc", "name"),
222     STATUS(StatusStatement.class, StatusEffectiveStatement.class, "status", "value"),
223     SUBMODULE(SubmoduleStatement.class, SubmoduleEffectiveStatement.class, "submodule", "name"),
224     @SuppressWarnings({ "unchecked", "rawtypes" })
225     TYPE(TypeStatement.class, (Class) TypeEffectiveStatement.class, "type", "name"),
226     TYPEDEF(TypedefStatement.class, TypedefEffectiveStatement.class, "typedef", "name"),
227     UNIQUE(UniqueStatement.class, UniqueEffectiveStatement.class, "unique", "tag"),
228     UNITS(UnitsStatement.class, UnitsEffectiveStatement.class, "units", "name"),
229     USES(UsesStatement.class, UsesEffectiveStatement.class, "uses", "name"),
230     VALUE(ValueStatement.class, ValueEffectiveStatement.class, "value", "value"),
231     WHEN(WhenStatement.class, WhenEffectiveStatement.class, "when", "condition"),
232     YANG_VERSION(YangVersionStatement.class, YangVersionEffectiveStatement.class, "yang-version", "value"),
233     YIN_ELEMENT(YinElementStatement.class, YinElementEffectiveStatement.class, "yin-element", "value");
234
235     private final Class<? extends DeclaredStatement<?>> declaredType;
236     private final Class<? extends EffectiveStatement<?, ?>> effectiveType;
237     private final QName name;
238     private final @Nullable QName argument;
239     private final boolean yinElement;
240
241     @SuppressFBWarnings("NP_STORE_INTO_NONNULL_FIELD")
242     YangStmtMapping(final Class<? extends DeclaredStatement<?>> declared,
243             final Class<? extends EffectiveStatement<?, ?>> effective, final String nameStr) {
244         declaredType = requireNonNull(declared);
245         effectiveType = requireNonNull(effective);
246         name = yinQName(nameStr);
247         argument = null;
248         yinElement = false;
249     }
250
251     YangStmtMapping(final Class<? extends DeclaredStatement<?>> declared,
252             final Class<? extends EffectiveStatement<?, ?>> effective, final String nameStr, final String argumentStr) {
253         this(declared, effective, nameStr, argumentStr, false);
254     }
255
256     YangStmtMapping(final Class<? extends DeclaredStatement<?>> declared,
257             final Class<? extends EffectiveStatement<?, ?>> effective, final String nameStr, final String argumentStr,
258             final boolean yinElement) {
259         declaredType = requireNonNull(declared);
260         effectiveType = requireNonNull(effective);
261         name = yinQName(nameStr);
262         argument = yinQName(argumentStr);
263         this.yinElement = yinElement;
264     }
265
266     private static QName yinQName(final String nameStr) {
267         return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
268     }
269
270     @Override
271     public QName getStatementName() {
272         return name;
273     }
274
275     @Override
276     public @Nullable QName getArgumentName() {
277         return argument;
278     }
279
280     @Override
281     public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
282         return declaredType;
283     }
284
285     @Override
286     public Class<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
287         return effectiveType;
288     }
289
290     @Override
291     public boolean isArgumentYinElement() {
292         return yinElement;
293     }
294 }