2 * Copyright (c) 2017 Pantheon Technologies, s.r.o. 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.parser.rfc7950.reactor;
10 import static org.opendaylight.yangtools.yang.common.YangVersion.VERSION_1;
11 import static org.opendaylight.yangtools.yang.common.YangVersion.VERSION_1_1;
13 import com.google.common.annotations.Beta;
14 import com.google.common.collect.ImmutableMap;
15 import com.google.common.collect.Sets;
16 import java.util.Collection;
19 import org.opendaylight.yangtools.yang.common.YangVersion;
20 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
21 import org.opendaylight.yangtools.yang.parser.openconfig.stmt.OpenConfigVersionSupport;
22 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
23 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace;
24 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.URIStringToImportPrefix;
25 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.action.ActionStatementSupport;
26 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata.AnydataStatementSupport;
27 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml.AnyxmlStatementSupport;
28 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.argument.ArgumentStatementSupport;
29 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment.AugmentStatementRFC6020Support;
30 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment.AugmentStatementRFC7950Support;
31 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.base.BaseStatementSupport;
32 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.belongs_to.BelongsToStatementSupport;
33 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.bit.BitStatementRFC6020Support;
34 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.bit.BitStatementRFC7950Support;
35 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.case_.CaseStatementRFC6020Support;
36 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.case_.CaseStatementRFC7950Support;
37 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.choice.ChoiceStatementRFC6020Support;
38 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.choice.ChoiceStatementRFC7950Support;
39 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.config.ConfigStatementSupport;
40 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.contact.ContactStatementSupport;
41 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.container.ContainerStatementRFC6020Support;
42 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.container.ContainerStatementRFC7950Support;
43 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.default_.DefaultStatementSupport;
44 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.description.DescriptionStatementSupport;
45 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate.DeviateStatementRFC6020Support;
46 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate.DeviateStatementRFC7950Support;
47 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviation.DeviationStatementSupport;
48 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.enum_.EnumStatementRFC6020Support;
49 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.enum_.EnumStatementRFC7950Support;
50 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.error_app_tag.ErrorAppTagStatementSupport;
51 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.error_message.ErrorMessageStatementSupport;
52 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension.ExtensionStatementSupport;
53 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.feature.FeatureStatementSupport;
54 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.fraction_digits.FractionDigitsStatementSupport;
55 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.grouping.GroupingStatementRFC6020Support;
56 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.grouping.GroupingStatementRFC7950Support;
57 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.identity.IdentityStatementRFC6020Support;
58 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.identity.IdentityStatementRFC7950Support;
59 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.if_feature.IfFeatureStatementSupport;
60 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.import_.ImportStatementRFC6020Support;
61 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.import_.ImportStatementRFC7950Support;
62 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.include.IncludeStatementRFC6020Support;
63 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.include.IncludeStatementRFC7950Support;
64 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.input.InputStatementRFC6020Support;
65 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.input.InputStatementRFC7950Support;
66 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.key.KeyStatementSupport;
67 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.leaf.LeafStatementSupport;
68 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.leaf_list.LeafListStatementRFC6020Support;
69 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.leaf_list.LeafListStatementRFC7950Support;
70 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.length.LengthStatementSupport;
71 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.list.ListStatementRFC6020Support;
72 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.list.ListStatementRFC7950Support;
73 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.mandatory.MandatoryStatementSupport;
74 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.max_elements.MaxElementsStatementSupport;
75 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.min_elements.MinElementsStatementSupport;
76 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.modifier.ModifierStatementSupport;
77 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.module.ModuleStatementRFC6020Support;
78 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.module.ModuleStatementRFC7950Support;
79 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.must.MustStatementSupport;
80 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.namespace.NamespaceStatementSupport;
81 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.notification.NotificationStatementRFC6020Support;
82 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.notification.NotificationStatementRFC7950Support;
83 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ordered_by.OrderedByStatementSupport;
84 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.organization.OrganizationStatementSupport;
85 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.output.OutputStatementRFC6020Support;
86 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.output.OutputStatementRFC7950Support;
87 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.path.PathStatementSupport;
88 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.pattern.PatternStatementRFC6020Support;
89 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.pattern.PatternStatementRFC7950Support;
90 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.position.PositionStatementSupport;
91 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.prefix.PrefixStatementSupport;
92 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.presence.PresenceStatementSupport;
93 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.range.RangeStatementSupport;
94 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.reference.ReferenceStatementSupport;
95 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine.RefineStatementRFC6020Support;
96 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine.RefineStatementRFC7950Support;
97 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.require_instance.RequireInstanceStatementSupport;
98 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.revision.RevisionStatementSupport;
99 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.revision_date.RevisionDateStatementSupport;
100 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.rpc.RpcStatementRFC6020Support;
101 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.rpc.RpcStatementRFC7950Support;
102 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.status.StatusStatementSupport;
103 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.submodule.SubmoduleStatementRFC6020Support;
104 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.submodule.SubmoduleStatementRFC7950Support;
105 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type.TypeStatementRFC6020Support;
106 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type.TypeStatementRFC7950Support;
107 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.typedef.TypedefStatementSupport;
108 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.unique.UniqueStatementSupport;
109 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.units.UnitsStatementSupport;
110 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.uses.UsesStatementSupport;
111 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.value.ValueStatementSupport;
112 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.when.WhenStatementSupport;
113 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.yang_version.YangVersionStatementSupport;
114 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.yin_element.YinElementStatementSupport;
115 import org.opendaylight.yangtools.yang.parser.spi.ExtensionNamespace;
116 import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace;
117 import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace;
118 import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace;
119 import org.opendaylight.yangtools.yang.parser.spi.NamespaceToModule;
120 import org.opendaylight.yangtools.yang.parser.spi.PreLinkageModuleNamespace;
121 import org.opendaylight.yangtools.yang.parser.spi.SubmoduleNamespace;
122 import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace;
123 import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedIdentitiesNamespace;
124 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
125 import org.opendaylight.yangtools.yang.parser.spi.meta.QNameCacheNamespace;
126 import org.opendaylight.yangtools.yang.parser.spi.meta.SemanticVersionModuleNamespace;
127 import org.opendaylight.yangtools.yang.parser.spi.meta.SemanticVersionNamespace;
128 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementDefinitionNamespace;
129 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportBundle;
130 import org.opendaylight.yangtools.yang.parser.spi.source.AugmentToChoiceNamespace;
131 import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToModuleContext;
132 import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleCtx;
133 import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleName;
134 import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToNamespace;
135 import org.opendaylight.yangtools.yang.parser.spi.source.ImportPrefixToModuleCtx;
136 import org.opendaylight.yangtools.yang.parser.spi.source.ImportPrefixToSemVerSourceIdentifier;
137 import org.opendaylight.yangtools.yang.parser.spi.source.ImportedModuleContext;
138 import org.opendaylight.yangtools.yang.parser.spi.source.IncludedModuleContext;
139 import org.opendaylight.yangtools.yang.parser.spi.source.IncludedSubmoduleNameToModuleCtx;
140 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName;
141 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToSourceIdentifier;
142 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToModuleQName;
143 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToNamespace;
144 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNamespaceForBelongsTo;
145 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleQNameToModuleName;
146 import org.opendaylight.yangtools.yang.parser.spi.source.ModulesDeviatedByModules;
147 import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
148 import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
149 import org.opendaylight.yangtools.yang.parser.spi.source.StmtOrderingNamespace;
150 import org.opendaylight.yangtools.yang.parser.spi.source.SupportedFeaturesNamespace;
151 import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace;
152 import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace.ValidationBundleType;
153 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
156 * Utility class holding entrypoints for assembling RFC6020/RFC7950 statement {@link CrossSourceStatementReactor}s.
158 * @author Robert Varga
161 public final class RFC7950Reactors {
162 private static final Set<YangVersion> SUPPORTED_VERSIONS = Sets.immutableEnumSet(VERSION_1, VERSION_1_1);
164 private static final StatementSupportBundle INIT_BUNDLE = StatementSupportBundle.builder(SUPPORTED_VERSIONS)
165 .addSupport(ValidationBundlesNamespace.BEHAVIOUR)
166 .addSupport(SupportedFeaturesNamespace.BEHAVIOUR)
167 .addSupport(ModulesDeviatedByModules.BEHAVIOUR)
170 private static final StatementSupportBundle PRE_LINKAGE_BUNDLE = StatementSupportBundle.derivedFrom(INIT_BUNDLE)
171 .addVersionSpecificSupport(VERSION_1, new ModuleStatementRFC6020Support())
172 .addVersionSpecificSupport(VERSION_1_1, new ModuleStatementRFC7950Support())
173 .addVersionSpecificSupport(VERSION_1, new SubmoduleStatementRFC6020Support())
174 .addVersionSpecificSupport(VERSION_1_1, new SubmoduleStatementRFC7950Support())
175 .addSupport(new NamespaceStatementSupport())
176 .addVersionSpecificSupport(VERSION_1, new ImportStatementRFC6020Support())
177 .addVersionSpecificSupport(VERSION_1_1, new ImportStatementRFC7950Support())
178 .addVersionSpecificSupport(VERSION_1, new IncludeStatementRFC6020Support())
179 .addVersionSpecificSupport(VERSION_1_1, new IncludeStatementRFC7950Support())
180 .addSupport(new BelongsToStatementSupport())
181 .addSupport(new PrefixStatementSupport())
182 .addSupport(new YangVersionStatementSupport())
183 .addSupport(new RevisionStatementSupport())
184 .addSupport(new RevisionDateStatementSupport())
185 .addSupport(ModuleNameToNamespace.BEHAVIOUR)
186 .addSupport(PreLinkageModuleNamespace.BEHAVIOUR)
187 .addSupport(ImpPrefixToNamespace.BEHAVIOUR)
188 .addSupport(ModuleCtxToModuleQName.BEHAVIOUR)
191 private static final StatementSupportBundle LINKAGE_BUNDLE = StatementSupportBundle
192 .derivedFrom(PRE_LINKAGE_BUNDLE)
193 .addSupport(new DescriptionStatementSupport())
194 .addSupport(new ReferenceStatementSupport())
195 .addSupport(new ContactStatementSupport())
196 .addSupport(new OrganizationStatementSupport())
197 .addSupport(ModuleNamespace.BEHAVIOUR)
198 .addSupport(ModuleNamespaceForBelongsTo.BEHAVIOUR)
199 .addSupport(SubmoduleNamespace.BEHAVIOUR)
200 .addSupport(NamespaceToModule.BEHAVIOUR)
201 .addSupport(ModuleNameToModuleQName.BEHAVIOUR)
202 .addSupport(ModuleCtxToSourceIdentifier.BEHAVIOUR)
203 .addSupport(ModuleQNameToModuleName.BEHAVIOUR)
204 .addSupport(PrefixToModule.BEHAVIOUR)
205 .addSupport(QNameCacheNamespace.getInstance())
206 .addSupport(ImportedModuleContext.BEHAVIOUR)
207 .addSupport(IncludedModuleContext.BEHAVIOUR)
208 .addSupport(IncludedSubmoduleNameToModuleCtx.BEHAVIOUR)
209 .addSupport(ImportPrefixToModuleCtx.BEHAVIOUR)
210 .addSupport(BelongsToPrefixToModuleCtx.BEHAVIOUR)
211 .addSupport(URIStringToImportPrefix.BEHAVIOUR)
212 .addSupport(BelongsToModuleContext.BEHAVIOUR)
213 .addSupport(QNameToStatementDefinition.BEHAVIOUR)
214 .addSupport(BelongsToPrefixToModuleName.BEHAVIOUR)
217 private static final StatementSupportBundle STMT_DEF_BUNDLE = StatementSupportBundle
218 .derivedFrom(LINKAGE_BUNDLE)
219 .addSupport(new YinElementStatementSupport())
220 .addSupport(new ArgumentStatementSupport())
221 .addSupport(new ExtensionStatementSupport())
222 .addSupport(new ChildSchemaNodeNamespace<>())
223 .addSupport(new SchemaNodeIdentifierBuildNamespace())
224 .addSupport(ExtensionNamespace.BEHAVIOUR)
225 .addSupport(new TypedefStatementSupport())
226 .addSupport(TypeNamespace.BEHAVIOUR)
227 .addVersionSpecificSupport(VERSION_1, new IdentityStatementRFC6020Support())
228 .addVersionSpecificSupport(VERSION_1_1, new IdentityStatementRFC7950Support())
229 .addSupport(IdentityNamespace.BEHAVIOUR)
230 .addSupport(new DefaultStatementSupport())
231 .addSupport(new StatusStatementSupport())
232 .addVersionSpecificSupport(VERSION_1, new TypeStatementRFC6020Support())
233 .addVersionSpecificSupport(VERSION_1_1, new TypeStatementRFC7950Support())
234 .addSupport(new UnitsStatementSupport())
235 .addSupport(new RequireInstanceStatementSupport())
236 .addVersionSpecificSupport(VERSION_1, new BitStatementRFC6020Support())
237 .addVersionSpecificSupport(VERSION_1_1, new BitStatementRFC7950Support())
238 .addSupport(new PathStatementSupport())
239 .addVersionSpecificSupport(VERSION_1, new EnumStatementRFC6020Support())
240 .addVersionSpecificSupport(VERSION_1_1, new EnumStatementRFC7950Support())
241 .addSupport(new LengthStatementSupport())
242 .addVersionSpecificSupport(VERSION_1, new PatternStatementRFC6020Support())
243 .addVersionSpecificSupport(VERSION_1_1, new PatternStatementRFC7950Support())
244 .addVersionSpecificSupport(VERSION_1_1, new ModifierStatementSupport())
245 .addSupport(new RangeStatementSupport())
246 .addSupport(new KeyStatementSupport())
247 .addVersionSpecificSupport(VERSION_1, new ContainerStatementRFC6020Support())
248 .addVersionSpecificSupport(VERSION_1_1, new ContainerStatementRFC7950Support())
249 .addVersionSpecificSupport(VERSION_1, new GroupingStatementRFC6020Support())
250 .addVersionSpecificSupport(VERSION_1_1, new GroupingStatementRFC7950Support())
251 .addVersionSpecificSupport(VERSION_1, new ListStatementRFC6020Support())
252 .addVersionSpecificSupport(VERSION_1_1, new ListStatementRFC7950Support())
253 .addSupport(new UniqueStatementSupport())
254 .addVersionSpecificSupport(VERSION_1_1, new ActionStatementSupport())
255 .addVersionSpecificSupport(VERSION_1, new RpcStatementRFC6020Support())
256 .addVersionSpecificSupport(VERSION_1_1, new RpcStatementRFC7950Support())
257 .addVersionSpecificSupport(VERSION_1, new InputStatementRFC6020Support())
258 .addVersionSpecificSupport(VERSION_1_1, new InputStatementRFC7950Support())
259 .addVersionSpecificSupport(VERSION_1, new OutputStatementRFC6020Support())
260 .addVersionSpecificSupport(VERSION_1_1, new OutputStatementRFC7950Support())
261 .addVersionSpecificSupport(VERSION_1, new NotificationStatementRFC6020Support())
262 .addVersionSpecificSupport(VERSION_1_1, new NotificationStatementRFC7950Support())
263 .addSupport(new FractionDigitsStatementSupport())
264 .addSupport(new BaseStatementSupport())
265 .addSupport(DerivedIdentitiesNamespace.BEHAVIOUR)
266 .addSupport(StatementDefinitionNamespace.BEHAVIOUR)
269 private static final StatementSupportBundle FULL_DECL_BUNDLE = StatementSupportBundle
270 .derivedFrom(STMT_DEF_BUNDLE)
271 .addSupport(new LeafStatementSupport())
272 .addSupport(new ConfigStatementSupport())
273 .addSupport(new DeviationStatementSupport())
274 .addVersionSpecificSupport(VERSION_1, new DeviateStatementRFC6020Support())
275 .addVersionSpecificSupport(VERSION_1_1, new DeviateStatementRFC7950Support())
276 .addVersionSpecificSupport(VERSION_1, new ChoiceStatementRFC6020Support())
277 .addVersionSpecificSupport(VERSION_1_1, new ChoiceStatementRFC7950Support())
278 .addVersionSpecificSupport(VERSION_1, new CaseStatementRFC6020Support())
279 .addVersionSpecificSupport(VERSION_1_1, new CaseStatementRFC7950Support())
280 .addSupport(new MustStatementSupport())
281 .addSupport(new MandatoryStatementSupport())
282 .addSupport(new AnyxmlStatementSupport())
283 .addVersionSpecificSupport(VERSION_1_1, new AnydataStatementSupport())
284 .addSupport(new IfFeatureStatementSupport())
285 .addSupport(new UsesStatementSupport())
286 .addSupport(GroupingNamespace.BEHAVIOUR)
287 .addSupport(new ErrorMessageStatementSupport())
288 .addSupport(new ErrorAppTagStatementSupport())
289 .addVersionSpecificSupport(VERSION_1, new LeafListStatementRFC6020Support())
290 .addVersionSpecificSupport(VERSION_1_1, new LeafListStatementRFC7950Support())
291 .addSupport(new PresenceStatementSupport())
292 .addSupport(new MaxElementsStatementSupport())
293 .addSupport(new MinElementsStatementSupport())
294 .addSupport(new OrderedByStatementSupport())
295 .addSupport(new WhenStatementSupport())
296 .addVersionSpecificSupport(VERSION_1, new AugmentStatementRFC6020Support())
297 .addVersionSpecificSupport(VERSION_1_1, new AugmentStatementRFC7950Support())
298 .addSupport(AugmentToChoiceNamespace.BEHAVIOUR)
299 .addVersionSpecificSupport(VERSION_1, new RefineStatementRFC6020Support())
300 .addVersionSpecificSupport(VERSION_1_1, new RefineStatementRFC7950Support())
301 .addSupport(new FeatureStatementSupport())
302 .addSupport(new PositionStatementSupport())
303 .addSupport(new ValueStatementSupport())
304 .addSupport(StmtOrderingNamespace.BEHAVIOUR)
307 private static final Map<ModelProcessingPhase, StatementSupportBundle> RFC7950_BUNDLES =
308 ImmutableMap.<ModelProcessingPhase, StatementSupportBundle>builder()
309 .put(ModelProcessingPhase.INIT, INIT_BUNDLE)
310 .put(ModelProcessingPhase.SOURCE_PRE_LINKAGE, PRE_LINKAGE_BUNDLE)
311 .put(ModelProcessingPhase.SOURCE_LINKAGE, LINKAGE_BUNDLE)
312 .put(ModelProcessingPhase.STATEMENT_DEFINITION, STMT_DEF_BUNDLE)
313 .put(ModelProcessingPhase.FULL_DECLARATION, FULL_DECL_BUNDLE)
314 .put(ModelProcessingPhase.EFFECTIVE_MODEL, FULL_DECL_BUNDLE)
317 private static final Map<ValidationBundleType, Collection<StatementDefinition>> RFC6020_VALIDATION_BUNDLE =
318 ImmutableMap.<ValidationBundleType, Collection<StatementDefinition>>builder()
319 .put(ValidationBundleType.SUPPORTED_REFINE_SUBSTATEMENTS,
320 YangValidationBundles.SUPPORTED_REFINE_SUBSTATEMENTS)
321 .put(ValidationBundleType.SUPPORTED_AUGMENT_TARGETS, YangValidationBundles.SUPPORTED_AUGMENT_TARGETS)
322 .put(ValidationBundleType.SUPPORTED_CASE_SHORTHANDS, YangValidationBundles.SUPPORTED_CASE_SHORTHANDS)
323 .put(ValidationBundleType.SUPPORTED_DATA_NODES, YangValidationBundles.SUPPORTED_DATA_NODES)
326 private static final CrossSourceStatementReactor DEFAULT_RFC6020_RFC7950_REACTOR = defaultReactorBuilder().build();
327 private static final CrossSourceStatementReactor VANILLA_RFC6020_RFC7950_REACTOR = vanillaReactorBuilder().build();
329 private RFC7950Reactors() {
330 throw new UnsupportedOperationException();
334 * Returns a pre-built {@link CrossSourceStatementReactor} supporting RFC6020 and RFC7950, along with OpenConfig
335 * semantic version extension. This is useful for parsing near-vanilla YANG models while providing complete
336 * support for semantic versions.
338 * @return A shared reactor instance.
340 public static CrossSourceStatementReactor defaultReactor() {
341 return DEFAULT_RFC6020_RFC7950_REACTOR;
345 * Returns a partially-configured {@link CustomCrossSourceStatementReactorBuilder}, with RFC6020/RFC7950
346 * and OpenConfig semantic version support enabled.
348 * @return A new {@link CustomCrossSourceStatementReactorBuilder}.
350 public static CustomCrossSourceStatementReactorBuilder defaultReactorBuilder() {
351 return vanillaReactorBuilder()
352 // Semantic version support
353 .addStatementSupport(ModelProcessingPhase.SOURCE_LINKAGE, OpenConfigVersionSupport.getInstance())
354 .addNamespaceSupport(ModelProcessingPhase.SOURCE_LINKAGE, SemanticVersionNamespace.BEHAVIOUR)
355 .addNamespaceSupport(ModelProcessingPhase.SOURCE_LINKAGE, SemanticVersionModuleNamespace.BEHAVIOUR)
356 .addNamespaceSupport(ModelProcessingPhase.SOURCE_LINKAGE,
357 ImportPrefixToSemVerSourceIdentifier.BEHAVIOUR);
361 * Returns a pre-built {@link CrossSourceStatementReactor} supporting both RFC6020 and RFC7950. This is useful
362 * for parsing vanilla YANG models without any semantic support for extensions. Notably missing is the semantic
363 * version extension, hence attempts to use semantic version mode will cause failures.
365 * @return A shared reactor instance.
367 public static CrossSourceStatementReactor vanillaReactor() {
368 return VANILLA_RFC6020_RFC7950_REACTOR;
372 * Returns a partially-configured {@link CustomCrossSourceStatementReactorBuilder}, with vanilla RFC6020/RFC7950
375 * @return A new {@link CustomCrossSourceStatementReactorBuilder}.
377 public static CustomCrossSourceStatementReactorBuilder vanillaReactorBuilder() {
378 return addDefaultRFC7950Bundles(new CustomCrossSourceStatementReactorBuilder(SUPPORTED_VERSIONS));
381 private static CustomCrossSourceStatementReactorBuilder addDefaultRFC7950Bundles(
382 final CustomCrossSourceStatementReactorBuilder builder) {
383 RFC7950_BUNDLES.entrySet().forEach(entry -> builder.addAllSupports(entry.getKey(), entry.getValue()));
384 RFC6020_VALIDATION_BUNDLE.entrySet().forEach(
385 entry -> builder.addValidationBundle(entry.getKey(), entry.getValue()));