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