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;
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.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;
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");
154 private final Class<? extends DeclaredStatement<?>> type;
155 private final Class<? extends EffectiveStatement<?,?>> effectiveType;
156 private final QName name;
157 private final QName argument;
158 private final boolean yinElement;
160 Rfc6020Mapping(Class<? extends DeclaredStatement<?>> clz, final String nameStr) {
161 type = Preconditions.checkNotNull(clz);
162 //FIXME: fill up effective type correctly
163 effectiveType = null;
164 name = yinQName(nameStr);
169 Rfc6020Mapping(Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr) {
170 type = Preconditions.checkNotNull(clz);
171 //FIXME: fill up effective type correctly
172 effectiveType = null;
173 name = yinQName(nameStr);
174 argument = yinQName(argumentStr);
175 this.yinElement = false;
178 Rfc6020Mapping(Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr,
179 final boolean yinElement) {
180 type = Preconditions.checkNotNull(clz);
181 //FIXME: fill up effective type correctly
182 effectiveType = null;
183 name = yinQName(nameStr);
184 argument = yinQName(argumentStr);
185 this.yinElement = yinElement;
188 @Nonnull private static QName yinQName(String nameStr) {
189 return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
193 public QName getStatementName() {
198 @Nullable public QName getArgumentName() {
203 @Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
208 public Class<? extends EffectiveStatement<?,?>> getEffectiveRepresentationClass() {
209 return effectiveType;
213 public boolean isArgumentYinElement() {