2 * Copyright (c) 2016 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.parser.rfc7950.reactor;
10 import com.google.common.annotations.Beta;
11 import com.google.common.collect.ImmutableMap;
12 import com.google.common.collect.Table;
13 import com.google.common.collect.Table.Cell;
14 import java.util.Collection;
15 import java.util.HashMap;
17 import java.util.Map.Entry;
19 import org.eclipse.jdt.annotation.NonNull;
20 import org.opendaylight.yangtools.concepts.Builder;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.common.YangVersion;
23 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
24 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
25 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
26 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
27 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportBundle;
28 import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace.ValidationBundleType;
29 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
32 public class CustomCrossSourceStatementReactorBuilder implements Builder<CrossSourceStatementReactor> {
33 private final ImmutableMap<ModelProcessingPhase, StatementSupportBundle.Builder> reactorSupportBundles;
34 private final Map<ValidationBundleType, Collection<StatementDefinition>> reactorValidationBundles = new HashMap<>();
37 * Creates a new CustomCrossSourceStatementReactorBuilder object initialized by specific version bundle. Statement
38 * parser will support all versions defined in given version bundle.
40 * @param supportedVersions
41 * bundle of supported verions
43 CustomCrossSourceStatementReactorBuilder(final Set<YangVersion> supportedVersions) {
44 reactorSupportBundles = ImmutableMap.<ModelProcessingPhase, StatementSupportBundle.Builder>builder()
45 .put(ModelProcessingPhase.INIT, StatementSupportBundle.builder(supportedVersions))
46 .put(ModelProcessingPhase.SOURCE_PRE_LINKAGE, StatementSupportBundle.builder(supportedVersions))
47 .put(ModelProcessingPhase.SOURCE_LINKAGE, StatementSupportBundle.builder(supportedVersions))
48 .put(ModelProcessingPhase.STATEMENT_DEFINITION, StatementSupportBundle.builder(supportedVersions))
49 .put(ModelProcessingPhase.FULL_DECLARATION, StatementSupportBundle.builder(supportedVersions))
50 .put(ModelProcessingPhase.EFFECTIVE_MODEL, StatementSupportBundle.builder(supportedVersions)).build();
53 public CustomCrossSourceStatementReactorBuilder addStatementSupport(final ModelProcessingPhase phase,
54 final StatementSupport<?, ?, ?> stmtSupport) {
55 reactorSupportBundles.get(phase).addSupport(stmtSupport);
59 public CustomCrossSourceStatementReactorBuilder overrideStatementSupport(final ModelProcessingPhase phase,
60 final StatementSupport<?, ?, ?> stmtSupport) {
61 reactorSupportBundles.get(phase).overrideSupport(stmtSupport);
65 public CustomCrossSourceStatementReactorBuilder addNamespaceSupport(final ModelProcessingPhase phase,
66 final NamespaceBehaviour<?, ?, ?> namespaceSupport) {
67 reactorSupportBundles.get(phase).addSupport(namespaceSupport);
71 public CustomCrossSourceStatementReactorBuilder addValidationBundle(final ValidationBundleType validationBundleType,
72 final Collection<StatementDefinition> validationBundle) {
73 reactorValidationBundles.put(validationBundleType, validationBundle);
77 public CustomCrossSourceStatementReactorBuilder addAllSupports(final ModelProcessingPhase phase,
78 final StatementSupportBundle stmtSupportBundle) {
79 addAllCommonStatementSupports(phase, stmtSupportBundle.getCommonDefinitions().values());
80 addAllVersionSpecificSupports(phase, stmtSupportBundle.getAllVersionSpecificDefinitions());
81 addAllNamespaceSupports(phase, stmtSupportBundle.getNamespaceDefinitions().values());
85 public CustomCrossSourceStatementReactorBuilder addAllNamespaceSupports(final ModelProcessingPhase phase,
86 final Collection<NamespaceBehaviour<?, ?, ?>> namespaceSupports) {
87 final StatementSupportBundle.Builder stmtBundleBuilder = reactorSupportBundles.get(phase);
88 for (final NamespaceBehaviour<?, ?, ?> namespaceSupport : namespaceSupports) {
89 stmtBundleBuilder.addSupport(namespaceSupport);
94 public CustomCrossSourceStatementReactorBuilder addAllCommonStatementSupports(final ModelProcessingPhase phase,
95 final Collection<StatementSupport<?, ?, ?>> statementSupports) {
96 final StatementSupportBundle.Builder stmtBundleBuilder = reactorSupportBundles.get(phase);
97 for (final StatementSupport<?, ?, ?> statementSupport : statementSupports) {
98 stmtBundleBuilder.addSupport(statementSupport);
103 public CustomCrossSourceStatementReactorBuilder addAllVersionSpecificSupports(final ModelProcessingPhase phase,
104 final Table<YangVersion, QName, StatementSupport<?, ?, ?>> versionSpecificSupports) {
105 final StatementSupportBundle.Builder stmtBundleBuilder = reactorSupportBundles.get(phase);
106 for (final Cell<YangVersion, QName, StatementSupport<?, ?, ?>> cell : versionSpecificSupports.cellSet()) {
107 stmtBundleBuilder.addVersionSpecificSupport(cell.getRowKey(), cell.getValue());
113 public @NonNull CrossSourceStatementReactor build() {
114 final StatementSupportBundle initBundle = reactorSupportBundles.get(ModelProcessingPhase.INIT).build();
115 final StatementSupportBundle preLinkageBundle = reactorSupportBundles
116 .get(ModelProcessingPhase.SOURCE_PRE_LINKAGE).setParent(initBundle).build();
117 final StatementSupportBundle linkageBundle = reactorSupportBundles.get(ModelProcessingPhase.SOURCE_LINKAGE)
118 .setParent(preLinkageBundle).build();
119 final StatementSupportBundle stmtDefBundle = reactorSupportBundles
120 .get(ModelProcessingPhase.STATEMENT_DEFINITION).setParent(linkageBundle).build();
121 final StatementSupportBundle fullDeclBundle = reactorSupportBundles.get(ModelProcessingPhase.FULL_DECLARATION)
122 .setParent(stmtDefBundle).build();
123 final StatementSupportBundle effectiveBundle = reactorSupportBundles.get(ModelProcessingPhase.EFFECTIVE_MODEL)
124 .setParent(fullDeclBundle).build();
126 final CrossSourceStatementReactor.Builder reactorBuilder = CrossSourceStatementReactor.builder()
127 .setBundle(ModelProcessingPhase.INIT, initBundle)
128 .setBundle(ModelProcessingPhase.SOURCE_PRE_LINKAGE, preLinkageBundle)
129 .setBundle(ModelProcessingPhase.SOURCE_LINKAGE, linkageBundle)
130 .setBundle(ModelProcessingPhase.STATEMENT_DEFINITION, stmtDefBundle)
131 .setBundle(ModelProcessingPhase.FULL_DECLARATION, fullDeclBundle)
132 .setBundle(ModelProcessingPhase.EFFECTIVE_MODEL, effectiveBundle);
134 for (final Entry<ValidationBundleType, Collection<StatementDefinition>> entry : reactorValidationBundles
136 reactorBuilder.setValidationBundle(entry.getKey(), entry.getValue());
139 return reactorBuilder.build();