Decouple config and netconf subsystems.
[controller.git] / opendaylight / netconf / mdsal-netconf-monitoring / src / main / java / org / opendaylight / controller / config / yang / netconf / mdsal / monitoring / NetconfMdsalMonitoringMapperModule.java
1 package org.opendaylight.controller.config.yang.netconf.mdsal.monitoring;
2
3 import java.util.Collections;
4 import java.util.Set;
5 import org.opendaylight.controller.config.util.capability.Capability;
6 import org.opendaylight.controller.netconf.api.monitoring.CapabilityListener;
7 import org.opendaylight.controller.netconf.api.monitoring.NetconfMonitoringService;
8 import org.opendaylight.controller.netconf.mapping.api.NetconfOperation;
9 import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService;
10 import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceFactory;
11 import org.opendaylight.controller.netconf.monitoring.GetSchema;
12
13 public class NetconfMdsalMonitoringMapperModule extends org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.AbstractNetconfMdsalMonitoringMapperModule {
14     public NetconfMdsalMonitoringMapperModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
15         super(identifier, dependencyResolver);
16     }
17
18     public NetconfMdsalMonitoringMapperModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final org.opendaylight.controller.config.yang.netconf.mdsal.monitoring.NetconfMdsalMonitoringMapperModule oldModule, final java.lang.AutoCloseable oldInstance) {
19         super(identifier, dependencyResolver, oldModule, oldInstance);
20     }
21
22     @Override
23     public void customValidation() {
24         // add custom validation form module attributes here.
25     }
26
27     @Override
28     public java.lang.AutoCloseable createInstance() {
29         final NetconfMonitoringService serverMonitoringDependency = getServerMonitoringDependency();
30
31         final MonitoringToMdsalWriter monitoringToMdsalWriter = new MonitoringToMdsalWriter(serverMonitoringDependency);
32         getBindingAwareBrokerDependency().registerProvider(monitoringToMdsalWriter);
33
34         final MdSalMonitoringMapperFactory mdSalMonitoringMapperFactory = new MdSalMonitoringMapperFactory(new MdsalMonitoringMapper(serverMonitoringDependency)) {
35             @Override
36             public void close() {
37                 super.close();
38                 monitoringToMdsalWriter.close();
39                 getAggregatorDependency().onRemoveNetconfOperationServiceFactory(this);
40             }
41         };
42
43         getAggregatorDependency().onAddNetconfOperationServiceFactory(mdSalMonitoringMapperFactory);
44         return mdSalMonitoringMapperFactory;
45
46     }
47
48     // FIXME almost exactly same code as in netconf-monitoring, refactor
49     private static class MdSalMonitoringMapperFactory implements NetconfOperationServiceFactory, AutoCloseable {
50
51         private final NetconfOperationService operationService;
52
53         private static final AutoCloseable AUTO_CLOSEABLE = new AutoCloseable() {
54             @Override
55             public void close() throws Exception {
56                 // NOOP
57             }
58         };
59
60         public MdSalMonitoringMapperFactory(final NetconfOperationService operationService) {
61             this.operationService = operationService;
62         }
63
64         @Override
65         public NetconfOperationService createService(final String netconfSessionIdForReporting) {
66             return operationService;
67         }
68
69         @Override
70         public Set<Capability> getCapabilities() {
71             // TODO
72             // No capabilities exposed to prevent clashes with schemas from mdsal-netconf-connector (it exposes all the schemas)
73             // If the schemas exposed by mdsal-netconf-connector are filtered, this class would expose monitoring related models
74             return Collections.emptySet();
75         }
76
77         @Override
78         public AutoCloseable registerCapabilityListener(final CapabilityListener listener) {
79             return AUTO_CLOSEABLE;
80         }
81
82         @Override
83         public void close() {}
84     }
85
86
87     private static class MdsalMonitoringMapper implements NetconfOperationService {
88
89         private final NetconfMonitoringService serverMonitoringDependency;
90
91         public MdsalMonitoringMapper(final NetconfMonitoringService serverMonitoringDependency) {
92             this.serverMonitoringDependency = serverMonitoringDependency;
93         }
94
95         @Override
96         public Set<NetconfOperation> getNetconfOperations() {
97             return Collections.<NetconfOperation>singleton(new GetSchema(serverMonitoringDependency));
98         }
99
100         @Override
101         public void close() {
102             // NOOP
103         }
104     }
105 }