81eb0dfdfe9e195b0a2436a3e70ea0562c87ada7
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / reactor / RFC7950Reactors.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies, s.r.o. 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.parser.rfc7950.reactor;
9
10 import static org.opendaylight.yangtools.yang.common.YangVersion.VERSION_1;
11 import static org.opendaylight.yangtools.yang.common.YangVersion.VERSION_1_1;
12
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;
17 import java.util.Map;
18 import java.util.Set;
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;
154
155 /**
156  * Utility class holding entrypoints for assembling RFC6020/RFC7950 statement {@link CrossSourceStatementReactor}s.
157  *
158  * @author Robert Varga
159  */
160 @Beta
161 public final class RFC7950Reactors {
162     private static final Set<YangVersion> SUPPORTED_VERSIONS = Sets.immutableEnumSet(VERSION_1, VERSION_1_1);
163
164     private static final StatementSupportBundle INIT_BUNDLE = StatementSupportBundle.builder(SUPPORTED_VERSIONS)
165             .addSupport(ValidationBundlesNamespace.BEHAVIOUR)
166             .addSupport(SupportedFeaturesNamespace.BEHAVIOUR)
167             .addSupport(ModulesDeviatedByModules.BEHAVIOUR)
168             .build();
169
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)
189             .build();
190
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)
215             .build();
216
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)
267             .build();
268
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)
305             .build();
306
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)
315             .build();
316
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)
324             .build();
325
326     private static final CrossSourceStatementReactor DEFAULT_RFC6020_RFC7950_REACTOR = defaultReactorBuilder().build();
327     private static final CrossSourceStatementReactor VANILLA_RFC6020_RFC7950_REACTOR = vanillaReactorBuilder().build();
328
329     private RFC7950Reactors() {
330         throw new UnsupportedOperationException();
331     }
332
333     /**
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.
337      *
338      * @return A shared reactor instance.
339      */
340     public static CrossSourceStatementReactor defaultReactor() {
341         return DEFAULT_RFC6020_RFC7950_REACTOR;
342     }
343
344     /**
345      * Returns a partially-configured {@link CustomCrossSourceStatementReactorBuilder}, with RFC6020/RFC7950
346      * and OpenConfig semantic version support enabled.
347      *
348      * @return A new {@link CustomCrossSourceStatementReactorBuilder}.
349      */
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);
358     }
359
360     /**
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.
364      *
365      * @return A shared reactor instance.
366      */
367     public static CrossSourceStatementReactor vanillaReactor() {
368         return VANILLA_RFC6020_RFC7950_REACTOR;
369     }
370
371     /**
372      * Returns a partially-configured {@link CustomCrossSourceStatementReactorBuilder}, with vanilla RFC6020/RFC7950
373      * support enabled.
374      *
375      * @return A new {@link CustomCrossSourceStatementReactorBuilder}.
376      */
377     public static CustomCrossSourceStatementReactorBuilder vanillaReactorBuilder() {
378         return addDefaultRFC7950Bundles(new CustomCrossSourceStatementReactorBuilder(SUPPORTED_VERSIONS));
379     }
380
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()));
386         return builder;
387     }
388 }