Cleanup use of Guava library
[yangtools.git] / yang / yang-model-api / src / main / java / org / opendaylight / yangtools / yang / model / api / YangStmtMapping.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 static java.util.Objects.requireNonNull;
11
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;
88
89 /**
90  * Mapping for both RFC6020 and RFC7950 statements.
91  */
92 @Beta
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");
162
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;
168
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);
174         argument = null;
175         yinElement = false;
176     }
177
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;
185     }
186
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;
195     }
196
197     @Nonnull private static QName yinQName(final String nameStr) {
198         return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
199     }
200
201     @Nonnull
202     @Override
203     public QName getStatementName() {
204         return name;
205     }
206
207     @Override
208     @Nullable public QName getArgumentName() {
209         return argument;
210     }
211
212     @Override
213     @Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
214         return type;
215     }
216
217     @Nonnull
218     @Override
219     public Class<? extends EffectiveStatement<?,?>> getEffectiveRepresentationClass() {
220         return effectiveType;
221     }
222
223     @Override
224     public boolean isArgumentYinElement() {
225         return yinElement;
226     }
227 }
228