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.Nonnull;
14 import javax.annotation.Nullable;
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.ActionStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
24 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
25 import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
27 import org.opendaylight.yangtools.yang.model.api.stmt.BitStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
31 import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement;
32 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
34 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
35 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
36 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
37 import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement;
38 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement;
39 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement;
40 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
41 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
42 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
43 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
44 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
45 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
46 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
47 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
48 import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
49 import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
50 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
51 import org.opendaylight.yangtools.yang.model.api.stmt.LeafStatement;
52 import org.opendaylight.yangtools.yang.model.api.stmt.LengthStatement;
53 import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
54 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement;
55 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement;
56 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement;
57 import org.opendaylight.yangtools.yang.model.api.stmt.ModifierStatement;
58 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
59 import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
60 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
61 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
62 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
63 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement;
64 import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
65 import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
66 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
67 import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement;
68 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
69 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
70 import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement;
71 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
72 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
73 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement;
74 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
75 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
76 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
77 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
78 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
79 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
80 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
81 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
82 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
83 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
84 import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement;
85 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
86 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
87 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement;
90 * Mapping for both RFC6020 and RFC7950 statements.
93 public enum YangStmtMapping implements StatementDefinition {
94 ACTION(ActionStatement.class, "action", "name"),
95 ANYDATA(AnydataStatement.class, "anydata", "name"),
96 ANYXML(AnyxmlStatement.class, "anyxml", "name"),
97 ARGUMENT(ArgumentStatement.class, "argument", "name"),
98 AUGMENT(AugmentStatement.class, "augment", "target-node"),
99 BASE(BaseStatement.class, "base", "name"),
100 BELONGS_TO(BelongsToStatement.class, "belongs-to", "module"),
101 BIT(BitStatement.class, "bit", "name"),
102 CASE(CaseStatement.class, "case", "name"),
103 CHOICE(ChoiceStatement.class, "choice", "name"),
104 CONFIG(ConfigStatement.class, "config", "value"),
105 CONTACT(ContactStatement.class, "contact", "text", true),
106 CONTAINER(ContainerStatement.class, "container", "name"),
107 DEFAULT(DefaultStatement.class, "default", "value"),
108 DESCRIPTION(DescriptionStatement.class, "description", "text", true),
109 DEVIATE(DeviateStatement.class, "deviate", "value"),
110 DEVIATION(DeviationStatement.class, "deviation", "target-node"),
111 ENUM(EnumStatement.class, "enum", "name"),
112 ERROR_APP_TAG(ErrorAppTagStatement.class, "error-app-tag", "value"),
113 ERROR_MESSAGE(ErrorMessageStatement.class, "error-message", "value", true),
114 EXTENSION(ExtensionStatement.class, "extension", "name"),
115 FEATURE(FeatureStatement.class, "feature", "name"),
116 FRACTION_DIGITS(FractionDigitsStatement.class, "fraction-digits", "value"),
117 GROUPING(GroupingStatement.class, "grouping", "name"),
118 IDENTITY(IdentityStatement.class, "identity", "name"),
119 IF_FEATURE(IfFeatureStatement.class, "if-feature", "name"),
120 IMPORT(ImportStatement.class, "import", "module"),
121 INCLUDE(IncludeStatement.class, "include", "module"),
122 INPUT(InputStatement.class, "input"),
123 KEY(KeyStatement.class, "key", "value"),
124 LEAF(LeafStatement.class, "leaf", "name"),
125 LEAF_LIST(LeafListStatement.class, "leaf-list", "name"),
126 LENGTH(LengthStatement.class, "length", "value"),
127 LIST(ListStatement.class, "list", "name"),
128 MANDATORY(MandatoryStatement.class, "mandatory", "value"),
129 MAX_ELEMENTS(MaxElementsStatement.class, "max-elements", "value"),
130 MIN_ELEMENTS(MinElementsStatement.class, "min-elements", "value"),
131 MODIFIER(ModifierStatement.class, "modifier", "value"),
132 MODULE(ModuleStatement.class, "module", "name"),
133 MUST(MustStatement.class, "must", "condition"),
134 NAMESPACE(NamespaceStatement.class, "namespace", "uri"),
135 NOTIFICATION(NotificationStatement.class, "notification", "name"),
136 ORDERED_BY(OrderedByStatement.class, "ordered-by", "value"),
137 ORGANIZATION(OrganizationStatement.class, "organization", "text", true),
138 OUTPUT(OutputStatement.class, "output"),
139 PATH(PathStatement.class, "path", "value"),
140 PATTERN(PatternStatement.class, "pattern", "value"),
141 POSITION(PositionStatement.class, "position", "value"),
142 PREFIX(PrefixStatement.class, "prefix", "value"),
143 PRESENCE(PresenceStatement.class, "presence", "value"),
144 RANGE(RangeStatement.class, "range", "value"),
145 REFERENCE(ReferenceStatement.class, "reference", "text", true),
146 REFINE(RefineStatement.class, "refine", "target-node"),
147 REQUIRE_INSTANCE(RequireInstanceStatement.class, "require-instance", "value"),
148 REVISION(RevisionStatement.class, "revision", "date"),
149 REVISION_DATE(RevisionDateStatement.class, "revision-date", "date"),
150 RPC(RpcStatement.class, "rpc", "name"),
151 STATUS(StatusStatement.class, "status", "value"),
152 SUBMODULE(SubmoduleStatement.class, "submodule", "name"),
153 TYPE(TypeStatement.class, "type", "name"),
154 TYPEDEF(TypedefStatement.class, "typedef", "name"),
155 UNIQUE(UniqueStatement.class, "unique", "tag"),
156 UNITS(UnitsStatement.class, "units", "name"),
157 USES(UsesStatement.class, "uses", "name"),
158 VALUE(ValueStatement.class, "value", "value"),
159 WHEN(WhenStatement.class, "when", "condition"),
160 YANG_VERSION(YangVersionStatement.class, "yang-version", "value"),
161 YIN_ELEMENT(YinElementStatement.class, "yin-element", "value");
163 private final Class<? extends DeclaredStatement<?>> type;
164 private final Class<? extends EffectiveStatement<?,?>> effectiveType;
165 private final QName name;
166 private final QName argument;
167 private final boolean yinElement;
169 YangStmtMapping(final Class<? extends DeclaredStatement<?>> clz, final String nameStr) {
170 type = requireNonNull(clz);
171 //FIXME: fill up effective type correctly
172 effectiveType = null;
173 name = yinQName(nameStr);
178 YangStmtMapping(final Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr) {
179 type = requireNonNull(clz);
180 //FIXME: fill up effective type correctly
181 effectiveType = null;
182 name = yinQName(nameStr);
183 argument = yinQName(argumentStr);
184 this.yinElement = false;
187 YangStmtMapping(final Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr,
188 final boolean yinElement) {
189 type = requireNonNull(clz);
190 //FIXME: fill up effective type correctly
191 effectiveType = null;
192 name = yinQName(nameStr);
193 argument = yinQName(argumentStr);
194 this.yinElement = yinElement;
197 @Nonnull private static QName yinQName(final String nameStr) {
198 return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
203 public QName getStatementName() {
208 @Nullable public QName getArgumentName() {
213 @Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
219 public Class<? extends EffectiveStatement<?,?>> getEffectiveRepresentationClass() {
220 return effectiveType;
224 public boolean isArgumentYinElement() {