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