Revert Merge "Bug 2366: new parser - Types & TypeDefs"
[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
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.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 QName name;
156     private final QName argument;
157     private final boolean yinElement;
158
159     private Rfc6020Mapping(Class<? extends DeclaredStatement<?>> clz, final String nameStr) {
160         type = Preconditions.checkNotNull(clz);
161         name = yinQName(nameStr);
162         argument = null;
163         yinElement = false;
164     }
165
166     private Rfc6020Mapping(Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr) {
167         type = Preconditions.checkNotNull(clz);
168         name = yinQName(nameStr);
169         argument = yinQName(argumentStr);
170         this.yinElement = false;
171     }
172
173     private Rfc6020Mapping(Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr,
174             final boolean yinElement) {
175         type = Preconditions.checkNotNull(clz);
176         name = yinQName(nameStr);
177         argument = yinQName(argumentStr);
178         this.yinElement = yinElement;
179     }
180
181     @Nonnull private static QName yinQName(String nameStr) {
182         return QName.cachedReference(QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr));
183     }
184
185     @Override
186     public QName getStatementName() {
187         return name;
188     }
189
190     @Override
191     @Nullable public QName getArgumentName() {
192         return argument;
193     }
194
195     @Override
196     @Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
197         return type;
198     }
199
200     @Override
201     public Class<? extends DeclaredStatement<?>> getEffectiveRepresentationClass() {
202         // FIXME: Add support once these interfaces are defined.
203         throw new UnsupportedOperationException("Not defined yet.");
204     }
205
206     public boolean isArgumentYinElement() {
207         return yinElement;
208     }
209 }
210