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.impl;
10 import com.google.common.annotations.Beta;
11 import org.eclipse.jdt.annotation.NonNull;
12 import org.opendaylight.yangtools.odlext.parser.AnyxmlSchemaLocationNamespace;
13 import org.opendaylight.yangtools.odlext.parser.AnyxmlSchemaLocationStatementSupport;
14 import org.opendaylight.yangtools.openconfig.parser.EncryptedValueStatementSupport;
15 import org.opendaylight.yangtools.openconfig.parser.HashedValueStatementSupport;
16 import org.opendaylight.yangtools.rfc6241.parser.GetFilterElementAttributesStatementSupport;
17 import org.opendaylight.yangtools.rfc6536.parser.DefaultDenyAllStatementSupport;
18 import org.opendaylight.yangtools.rfc6536.parser.DefaultDenyWriteStatementSupport;
19 import org.opendaylight.yangtools.rfc6643.parser.AliasStatementSupport;
20 import org.opendaylight.yangtools.rfc6643.parser.DefValStatementSupport;
21 import org.opendaylight.yangtools.rfc6643.parser.DisplayHintStatementSupport;
22 import org.opendaylight.yangtools.rfc6643.parser.ImpliedStatementSupport;
23 import org.opendaylight.yangtools.rfc6643.parser.MaxAccessStatementSupport;
24 import org.opendaylight.yangtools.rfc6643.parser.OidStatementSupport;
25 import org.opendaylight.yangtools.rfc6643.parser.SubIdStatementSupport;
26 import org.opendaylight.yangtools.rfc7952.parser.AnnotationStatementSupport;
27 import org.opendaylight.yangtools.rfc8040.parser.YangDataArgumentNamespace;
28 import org.opendaylight.yangtools.rfc8040.parser.YangDataStatementSupport;
29 import org.opendaylight.yangtools.rfc8528.parser.MountPointStatementSupport;
30 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.CustomCrossSourceStatementReactorBuilder;
31 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
32 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
33 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
34 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor.Builder;
35 import org.opendaylight.yangtools.yang.xpath.api.YangXPathParserFactory;
38 * Utility class for instantiating default-configured {@link CrossSourceStatementReactor}s.
40 * @author Robert Varga
43 public final class DefaultReactors {
44 private static final class DefaultReactor {
45 // Thread-safe lazy init
46 static final @NonNull CrossSourceStatementReactor INSTANCE = defaultReactorBuilder().build();
49 private DefaultReactors() {
54 * Get a shared default-configured reactor instance. This instance is configured to handle both RFC6020 and RFC7950,
57 * <li>RFC6536's default-deny-{all,write} extensions</li>
58 * <li>RFC7952's annotation extension</li>
59 * <li>RFC8040's yang-data extension</li>
60 * <li>OpenConfig extensions</li>
61 * <li>OpenDaylight extensions</li>
64 * @return a shared default-configured reactor instance.
66 public static @NonNull CrossSourceStatementReactor defaultReactor() {
67 return DefaultReactor.INSTANCE;
71 * Return a baseline CrossSourceStatementReactor {@link Builder}. The builder is initialized to the equivalent
72 * of the reactor returned via {@link #defaultReactor()}, but can be further customized before use.
74 * @return A populated CrossSourceStatementReactor builder.
76 public static @NonNull CustomCrossSourceStatementReactorBuilder defaultReactorBuilder() {
77 return addExtensions(RFC7950Reactors.defaultReactorBuilder());
81 * Return a baseline CrossSourceStatementReactor {@link Builder}. The builder is initialized to the equivalent
82 * of the reactor returned via {@link #defaultReactor()}, but can be further customized before use.
84 * @return A populated CrossSourceStatementReactor builder.
86 public static @NonNull CustomCrossSourceStatementReactorBuilder defaultReactorBuilder(
87 final YangXPathParserFactory xpathFactory) {
88 return addExtensions(RFC7950Reactors.defaultReactorBuilder(xpathFactory));
91 private static @NonNull CustomCrossSourceStatementReactorBuilder addExtensions(
92 final @NonNull CustomCrossSourceStatementReactorBuilder builder) {
94 // AnyxmlSchemaLocation support
95 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
96 AnyxmlSchemaLocationStatementSupport.getInstance())
97 .addNamespaceSupport(ModelProcessingPhase.FULL_DECLARATION, AnyxmlSchemaLocationNamespace.BEHAVIOUR)
99 // RFC6241 get-filter-element-attributes support
100 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
101 GetFilterElementAttributesStatementSupport.getInstance())
103 // RFC6536 default-deny-{all,write} support
104 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
105 DefaultDenyAllStatementSupport.getInstance())
106 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
107 DefaultDenyWriteStatementSupport.getInstance())
109 // RFC6643 extensions
110 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, DisplayHintStatementSupport.getInstance())
111 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, MaxAccessStatementSupport.getInstance())
112 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, DefValStatementSupport.getInstance())
113 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, ImpliedStatementSupport.getInstance())
114 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, AliasStatementSupport.getInstance())
115 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, OidStatementSupport.getInstance())
116 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, SubIdStatementSupport.getInstance())
118 // RFC7952 annotation support
119 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, AnnotationStatementSupport.getInstance())
121 // RFC8040 yang-data support
122 .addNamespaceSupport(ModelProcessingPhase.FULL_DECLARATION, YangDataArgumentNamespace.BEHAVIOUR)
123 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, YangDataStatementSupport.getInstance())
125 // RFC8528 yang-data support
126 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION, MountPointStatementSupport.getInstance())
128 // OpenConfig extensions support (except openconfig-version)
129 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
130 EncryptedValueStatementSupport.getInstance())
131 .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
132 HashedValueStatementSupport.getInstance());