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