Rework BaseScheams
[netconf.git] / plugins / netconf-client-mdsal / src / main / java / org / opendaylight / netconf / client / mdsal / impl / DefaultBaseNetconfSchemaProvider.java
1 /*
2  * Copyright (c) 2020 PANTHEON.tech, 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.netconf.client.mdsal.impl;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.base.Stopwatch;
13 import com.google.common.cache.CacheBuilder;
14 import com.google.common.cache.CacheLoader;
15 import com.google.common.cache.LoadingCache;
16 import com.google.common.collect.ImmutableSet;
17 import javax.inject.Inject;
18 import javax.inject.Singleton;
19 import org.eclipse.jdt.annotation.NonNull;
20 import org.opendaylight.mdsal.binding.runtime.spi.ModuleInfoSnapshotBuilder;
21 import org.opendaylight.netconf.api.CapabilityURN;
22 import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemaProvider;
23 import org.opendaylight.netconf.client.mdsal.api.NetconfSessionPreferences;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Candidate;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.ConfirmedCommit;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.IetfNetconfData;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.RollbackOnError;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Startup;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Url;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Validate$F;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.WritableRunning;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.Xpath;
33 import org.opendaylight.yangtools.yang.binding.YangFeature;
34 import org.opendaylight.yangtools.yang.parser.api.YangParserException;
35 import org.opendaylight.yangtools.yang.parser.api.YangParserFactory;
36 import org.osgi.service.component.annotations.Activate;
37 import org.osgi.service.component.annotations.Component;
38 import org.osgi.service.component.annotations.Reference;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42 @Component
43 @Singleton
44 public final class DefaultBaseNetconfSchemaProvider implements BaseNetconfSchemaProvider {
45     private record Capabilities(
46             boolean writableRunning,
47             boolean candidate,
48             boolean confirmedCommit,
49             boolean rollbackOnError,
50             boolean validate,
51             boolean startup,
52             boolean url,
53             boolean xpath,
54             boolean notifications,
55             boolean library,
56             boolean monitoring) {
57         // Nothing else
58     }
59
60     private static final Logger LOG = LoggerFactory.getLogger(DefaultBaseNetconfSchemaProvider.class);
61
62     private final LoadingCache<Capabilities, DefaultBaseNetconfSchema> baseSchemas = CacheBuilder.newBuilder()
63         .weakValues().build(new CacheLoader<>() {
64             @Override
65             public DefaultBaseNetconfSchema load(final Capabilities key) throws YangParserException {
66                 LOG.debug("Loading base schema for {}", key);
67                 final var sw = Stopwatch.createStarted();
68
69                 final var builder = new ModuleInfoSnapshotBuilder(parserFactory)
70                     .add(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601
71                         .YangModuleInfoImpl.getInstance());
72
73                 final var netconfFeatures = ImmutableSet.<YangFeature<?, @NonNull IetfNetconfData>>builder();
74                 if (key.writableRunning) {
75                     netconfFeatures.add(WritableRunning.VALUE);
76                 }
77                 if (key.candidate) {
78                     netconfFeatures.add(Candidate.VALUE);
79                 }
80                 if (key.confirmedCommit) {
81                     netconfFeatures.add(ConfirmedCommit.VALUE);
82                 }
83                 if (key.rollbackOnError) {
84                     netconfFeatures.add(RollbackOnError.VALUE);
85                 }
86                 if (key.validate) {
87                     netconfFeatures.add(Validate$F.VALUE);
88                 }
89                 if (key.startup) {
90                     netconfFeatures.add(Startup.VALUE);
91                 }
92                 if (key.url) {
93                     netconfFeatures.add(Url.VALUE);
94                 }
95                 if (key.xpath) {
96                     netconfFeatures.add(Xpath.VALUE);
97                 }
98                 builder.addModuleFeatures(IetfNetconfData.class, netconfFeatures.build());
99
100                 if (key.library) {
101                     builder.add(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104
102                         .YangModuleInfoImpl.getInstance());
103                 }
104                 if (key.monitoring) {
105                     builder.add(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring
106                         .rev101004.YangModuleInfoImpl.getInstance());
107                 }
108                 if (key.notifications) {
109                     builder
110                         .add(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714
111                             .YangModuleInfoImpl.getInstance())
112                         .add(org.opendaylight.yang.svc.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications
113                             .rev120206.YangModuleInfoImpl.getInstance());
114                 }
115
116                 final var snapshot = builder.build();
117                 LOG.debug("Schema for {} assembled in {}", key, sw);
118                 return new DefaultBaseNetconfSchema(snapshot.modelContext());
119             }
120         });
121     private final YangParserFactory parserFactory;
122
123     @Inject
124     @Activate
125     public DefaultBaseNetconfSchemaProvider(@Reference final YangParserFactory parserFactory) {
126         this.parserFactory = requireNonNull(parserFactory);
127     }
128
129     @Override
130     public DefaultBaseNetconfSchema baseSchemaForCapabilities(final NetconfSessionPreferences sessionPreferences) {
131         return baseSchemas.getUnchecked(new Capabilities(
132             sessionPreferences.isRunningWritable(),
133             sessionPreferences.isCandidateSupported(),
134             sessionPreferences.containsNonModuleCapability(CapabilityURN.CONFIRMED_COMMIT_1_1)
135                 || sessionPreferences.containsNonModuleCapability(CapabilityURN.CONFIRMED_COMMIT),
136             sessionPreferences.isRollbackSupported(),
137             sessionPreferences.containsNonModuleCapability(CapabilityURN.VALIDATE_1_1)
138                 || sessionPreferences.containsNonModuleCapability(CapabilityURN.VALIDATE),
139             sessionPreferences.containsNonModuleCapability(CapabilityURN.STARTUP),
140             sessionPreferences.containsNonModuleCapability(CapabilityURN.URL),
141             sessionPreferences.containsNonModuleCapability(CapabilityURN.XPATH),
142             sessionPreferences.isNotificationsSupported(),
143             sessionPreferences.containsNonModuleCapability(CapabilityURN.YANG_LIBRARY)
144                 || sessionPreferences.containsNonModuleCapability(CapabilityURN.YANG_LIBRARY_1_1),
145             sessionPreferences.isMonitoringSupported()));
146     }
147 }