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