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