2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.model.api;
10 import static java.util.Objects.requireNonNull;
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;
161 * Mapping for both RFC6020 and RFC7950 statements.
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",
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");
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;
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);
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);
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;
268 private static QName yinQName(final String nameStr) {
269 return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
273 public QName getStatementName() {
278 public Optional<ArgumentDefinition> getArgumentDefinition() {
279 return ArgumentDefinition.ofNullable(argument, yinElement);
283 public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
288 public Class<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
289 return effectiveType;