2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.model.api;
10 import com.google.common.annotations.Beta;
11 import com.google.common.base.Preconditions;
12 import javax.annotation.Nonnull;
13 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.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;
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");
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;
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);
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;
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;
189 @Nonnull private static QName yinQName(String nameStr) {
190 return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
194 public QName getStatementName() {
199 @Nullable public QName getArgumentName() {
204 @Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
209 public Class<? extends EffectiveStatement<?,?>> getEffectiveRepresentationClass() {
210 return effectiveType;
213 public boolean isArgumentYinElement() {