f087130e7cf67996b4b567b6adb929558bed3ec7
[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 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;
87
88 /**
89  * Mapping for both RFC6020 and RFC7950 statements.
90  */
91 @Beta
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");
161
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;
167
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);
173         argument = null;
174         yinElement = false;
175     }
176
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;
184     }
185
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;
194     }
195
196     @Nonnull private static QName yinQName(final String nameStr) {
197         return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
198     }
199
200     @Nonnull
201     @Override
202     public QName getStatementName() {
203         return name;
204     }
205
206     @Override
207     @Nullable public QName getArgumentName() {
208         return argument;
209     }
210
211     @Override
212     @Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
213         return type;
214     }
215
216     @Nonnull
217     @Override
218     public Class<? extends EffectiveStatement<?,?>> getEffectiveRepresentationClass() {
219         return effectiveType;
220     }
221
222     @Override
223     public boolean isArgumentYinElement() {
224         return yinElement;
225     }
226 }
227