Merge "Fix modifier ordering"
[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.StatementDefinition;
18 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
19 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
20 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.BitStatement;
24 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
25 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
27 import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
31 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
32 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement;
34 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement;
35 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement;
36 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
37 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
38 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
39 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
40 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
41 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
42 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
43 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
44 import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
45 import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
46 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
47 import org.opendaylight.yangtools.yang.model.api.stmt.LeafStatement;
48 import org.opendaylight.yangtools.yang.model.api.stmt.LengthStatement;
49 import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
50 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement;
51 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement;
52 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement;
53 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
54 import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
55 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
56 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
57 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
58 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement;
59 import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
60 import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
61 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
62 import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement;
63 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
64 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
65 import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement;
66 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
67 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
68 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement;
69 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
70 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
71 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
72 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
73 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
74 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
75 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
76 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
77 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
78 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
79 import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement;
80 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
81 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
82 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement;
83
84 @Beta
85 public enum Rfc6020Mapping implements StatementDefinition {
86     Anyxml(AnyxmlStatement.class, "anyxml", "name"),
87     Argument(ArgumentStatement.class, "argument", "name"),
88     Augment(AugmentStatement.class, "augment", "target-node"),
89     Base(BaseStatement.class, "base", "name"),
90     BelongsTo(BelongsToStatement.class, "belongs-to", "module"),
91     Bit(BitStatement.class, "bit", "name"),
92     Case(CaseStatement.class, "case", "name"),
93     Choice(ChoiceStatement.class, "choice", "name"),
94     Config(ConfigStatement.class, "config", "value"),
95     Contact(ContactStatement.class, "contact", "text", true),
96     Container(ContainerStatement.class, "container", "name"),
97     Default(DefaultStatement.class, "default", "value"),
98     Description(DescriptionStatement.class, "description", "text", true),
99     Deviate(DeviateStatement.class, "deviate", "value"),
100     Deviation(DeviationStatement.class, "deviation", "target-node"),
101     Enum(EnumStatement.class, "enum", "name"),
102     ErrorAppTag(ErrorAppTagStatement.class, "error-app-tag", "value"),
103     ErrorMessage(ErrorMessageStatement.class, "error-message", "value", true),
104     Extension(ExtensionStatement.class, "extension", "name"),
105     Feature(FeatureStatement.class, "feature", "name"),
106     FractionDigits(FractionDigitsStatement.class, "fraction-digits", "value"),
107     Grouping(GroupingStatement.class, "grouping", "name"),
108     Identity(IdentityStatement.class, "identity", "name"),
109     IfFeature(IfFeatureStatement.class, "if-feature", "name"),
110     Import(ImportStatement.class, "import", "module"),
111     Include(IncludeStatement.class, "include", "module"),
112     Input(InputStatement.class, "input"),
113     Key(KeyStatement.class, "key", "value"),
114     Leaf(LeafStatement.class, "leaf", "name"),
115     LeafList(LeafListStatement.class, "leaf-list", "name"),
116     Length(LengthStatement.class, "length", "value"),
117     List(ListStatement.class, "list", "name"),
118     Mandatory(MandatoryStatement.class, "mandatory", "value"),
119     MaxElements(MaxElementsStatement.class, "max-elements", "value"),
120     MinElements(MinElementsStatement.class, "min-elements", "value"),
121     Module(ModuleStatement.class, "module", "name"),
122     Must(MustStatement.class, "must", "condition"),
123     Namespace(NamespaceStatement.class, "namespace", "uri"),
124     Notification(NotificationStatement.class, "notification", "name"),
125     OrderedBy(OrderedByStatement.class, "ordered-by", "value"),
126     Organization(OrganizationStatement.class, "organization", "text", true),
127     Output(OutputStatement.class, "output"),
128     Path(PathStatement.class, "path", "value"),
129     Pattern(PatternStatement.class, "pattern", "value"),
130     Position(PositionStatement.class, "position", "value"),
131     Prefix(PrefixStatement.class, "prefix", "value"),
132     Presence(PresenceStatement.class, "presence", "value"),
133     Range(RangeStatement.class, "range", "value"),
134     Reference(ReferenceStatement.class, "reference", "text", true),
135     Refine(RefineStatement.class, "refine", "target-node"),
136     RequireInstance(RequireInstanceStatement.class, "require-instance", "value"),
137     Revision(RevisionStatement.class, "revision", "date"),
138     RevisionDate(RevisionDateStatement.class, "revision-date", "date"),
139     Rpc(RpcStatement.class, "rpc", "name"),
140     Status(StatusStatement.class, "status", "value"),
141     Submodule(SubmoduleStatement.class, "submodule", "name"),
142     Type(TypeStatement.class, "type", "name"),
143     Typedef(TypedefStatement.class, "typedef", "name"),
144     Unique(UniqueStatement.class, "unique", "tag"),
145     Units(UnitsStatement.class, "units", "name"),
146     Uses(UsesStatement.class, "uses", "name"),
147     Value(ValueStatement.class, "value", "value"),
148     When(WhenStatement.class, "when", "condition"),
149     YangVersion(YangVersionStatement.class, "yang-version", "value"),
150     YinElement(YinElementStatement.class, "yin-element", "value");
151
152     private final Class<? extends DeclaredStatement<?>> type;
153     private final QName name;
154     private final QName argument;
155     private final boolean yinElement;
156
157
158     private Rfc6020Mapping(Class<? extends DeclaredStatement<?>> clz, final String nameStr) {
159         type = Preconditions.checkNotNull(clz);
160         name = yinQName(nameStr);
161         argument = null;
162         yinElement = false;
163     }
164
165     private Rfc6020Mapping(Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr) {
166         type = Preconditions.checkNotNull(clz);
167         name = yinQName(nameStr);
168         argument = yinQName(argumentStr);
169         this.yinElement = false;
170     }
171
172     private Rfc6020Mapping(Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr,
173             final boolean yinElement) {
174         type = Preconditions.checkNotNull(clz);
175         name = yinQName(nameStr);
176         argument = yinQName(argumentStr);
177         this.yinElement = yinElement;
178     }
179
180     @Nonnull private static QName yinQName(String nameStr) {
181         return QName.cachedReference(QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr));
182     }
183
184     @Override
185     public QName getStatementName() {
186         return name;
187     }
188
189     @Override
190     @Nullable public QName getArgumentName() {
191         return argument;
192     }
193
194     @Override
195     @Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
196         return type;
197     }
198
199     @Override
200     public Class<? extends DeclaredStatement<?>> getEffectiveRepresentationClass() {
201         // FIXME: Add support once these interfaces are defined.
202         throw new UnsupportedOperationException("Not defined yet.");
203     }
204
205     public boolean isArgumentYinElement() {
206         return yinElement;
207     }
208 }
209