d9ebbfe8b3e62454cf968bef48883f800b142711
[yangtools.git] / parser / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / reactor / CustomCrossSourceStatementReactorBuilder.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. 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 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;
16 import java.util.Map;
17 import java.util.Map.Entry;
18 import java.util.Set;
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;
30
31 @Beta
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<>();
35
36     /**
37      * Creates a new CustomCrossSourceStatementReactorBuilder object initialized by specific version bundle. Statement
38      * parser will support all versions defined in given version bundle.
39      *
40      * @param supportedVersions
41      *            bundle of supported verions
42      */
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();
51     }
52
53     public @NonNull CustomCrossSourceStatementReactorBuilder addStatementSupport(final ModelProcessingPhase phase,
54             final StatementSupport<?, ?, ?> stmtSupport) {
55         reactorSupportBundles.get(phase).addSupport(stmtSupport);
56         return this;
57     }
58
59     public @NonNull CustomCrossSourceStatementReactorBuilder overrideStatementSupport(final ModelProcessingPhase phase,
60             final StatementSupport<?, ?, ?> stmtSupport) {
61         reactorSupportBundles.get(phase).overrideSupport(stmtSupport);
62         return this;
63     }
64
65     public @NonNull CustomCrossSourceStatementReactorBuilder addNamespaceSupport(final ModelProcessingPhase phase,
66             final NamespaceBehaviour<?, ?, ?> namespaceSupport) {
67         reactorSupportBundles.get(phase).addSupport(namespaceSupport);
68         return this;
69     }
70
71     public @NonNull CustomCrossSourceStatementReactorBuilder addValidationBundle(
72             final ValidationBundleType validationBundleType, final Collection<StatementDefinition> validationBundle) {
73         reactorValidationBundles.put(validationBundleType, validationBundle);
74         return this;
75     }
76
77     public @NonNull 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());
82         return this;
83     }
84
85     public @NonNull 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);
90         }
91         return this;
92     }
93
94     public @NonNull CustomCrossSourceStatementReactorBuilder addAllCommonStatementSupports(
95             final ModelProcessingPhase phase, final Collection<StatementSupport<?, ?, ?>> statementSupports) {
96         final StatementSupportBundle.Builder stmtBundleBuilder = reactorSupportBundles.get(phase);
97         for (final StatementSupport<?, ?, ?> statementSupport : statementSupports) {
98             stmtBundleBuilder.addSupport(statementSupport);
99         }
100         return this;
101     }
102
103     public @NonNull CustomCrossSourceStatementReactorBuilder addAllVersionSpecificSupports(
104             final ModelProcessingPhase phase,
105             final Table<YangVersion, QName, StatementSupport<?, ?, ?>> versionSpecificSupports) {
106         final StatementSupportBundle.Builder stmtBundleBuilder = reactorSupportBundles.get(phase);
107         for (final Cell<YangVersion, QName, StatementSupport<?, ?, ?>> cell : versionSpecificSupports.cellSet()) {
108             stmtBundleBuilder.addVersionSpecificSupport(cell.getRowKey(), cell.getValue());
109         }
110         return this;
111     }
112
113     @Override
114     public @NonNull CrossSourceStatementReactor build() {
115         final StatementSupportBundle initBundle = reactorSupportBundles.get(ModelProcessingPhase.INIT).build();
116         final StatementSupportBundle preLinkageBundle = reactorSupportBundles
117                 .get(ModelProcessingPhase.SOURCE_PRE_LINKAGE).setParent(initBundle).build();
118         final StatementSupportBundle linkageBundle = reactorSupportBundles.get(ModelProcessingPhase.SOURCE_LINKAGE)
119                 .setParent(preLinkageBundle).build();
120         final StatementSupportBundle stmtDefBundle = reactorSupportBundles
121                 .get(ModelProcessingPhase.STATEMENT_DEFINITION).setParent(linkageBundle).build();
122         final StatementSupportBundle fullDeclBundle = reactorSupportBundles.get(ModelProcessingPhase.FULL_DECLARATION)
123                 .setParent(stmtDefBundle).build();
124         final StatementSupportBundle effectiveBundle = reactorSupportBundles.get(ModelProcessingPhase.EFFECTIVE_MODEL)
125                 .setParent(fullDeclBundle).build();
126
127         final CrossSourceStatementReactor.Builder reactorBuilder = CrossSourceStatementReactor.builder()
128                 .setBundle(ModelProcessingPhase.INIT, initBundle)
129                 .setBundle(ModelProcessingPhase.SOURCE_PRE_LINKAGE, preLinkageBundle)
130                 .setBundle(ModelProcessingPhase.SOURCE_LINKAGE, linkageBundle)
131                 .setBundle(ModelProcessingPhase.STATEMENT_DEFINITION, stmtDefBundle)
132                 .setBundle(ModelProcessingPhase.FULL_DECLARATION, fullDeclBundle)
133                 .setBundle(ModelProcessingPhase.EFFECTIVE_MODEL, effectiveBundle);
134
135         for (final Entry<ValidationBundleType, Collection<StatementDefinition>> entry : reactorValidationBundles
136                 .entrySet()) {
137             reactorBuilder.setValidationBundle(entry.getKey(), entry.getValue());
138         }
139
140         return reactorBuilder.build();
141     }
142 }