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