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 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;
158 * Mapping for both RFC6020 and RFC7950 statements.
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",
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");
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;
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);
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);
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;
263 private static @NonNull QName yinQName(final String nameStr) {
264 return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
268 public QName getStatementName() {
274 public QName getArgumentName() {
279 public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
284 public Class<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
285 return effectiveType;
289 public boolean isArgumentYinElement() {