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 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;
159 * Mapping for both RFC6020 and RFC7950 statements.
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",
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");
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;
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);
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);
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;
266 private static QName yinQName(final String nameStr) {
267 return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
271 public QName getStatementName() {
276 public @Nullable QName getArgumentName() {
281 public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
286 public Class<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
287 return effectiveType;
291 public boolean isArgumentYinElement() {