Eliminate GlobalNetconfSshScheduledExecutor
[netconf.git] / protocol / netconf-server / src / main / java / org / opendaylight / netconf / server / osgi / NetconfMonitoringServiceImpl.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.netconf.server.osgi;
9
10 import static java.util.Objects.requireNonNull;
11
12 import java.util.Optional;
13 import java.util.concurrent.Executors;
14 import java.util.concurrent.ScheduledExecutorService;
15 import java.util.concurrent.ThreadFactory;
16 import java.util.concurrent.TimeUnit;
17 import org.opendaylight.netconf.server.api.monitoring.NetconfMonitoringService;
18 import org.opendaylight.netconf.server.api.monitoring.SessionListener;
19 import org.opendaylight.netconf.server.api.notifications.BaseNotificationPublisherRegistration;
20 import org.opendaylight.netconf.server.api.operations.NetconfOperationServiceFactory;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Schemas;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Sessions;
24 import org.opendaylight.yangtools.concepts.Registration;
25
26 public class NetconfMonitoringServiceImpl implements NetconfMonitoringService, AutoCloseable {
27     private final NetconfCapabilityMonitoringService capabilityMonitoring;
28     private final NetconfSessionMonitoringService sessionMonitoring;
29     private final ScheduledExecutorService executorService;
30
31     private NetconfMonitoringServiceImpl(final NetconfOperationServiceFactory opProvider,
32             final NetconfSessionMonitoringService sessionMonitoring) {
33         capabilityMonitoring = new NetconfCapabilityMonitoringService(opProvider);
34         this.sessionMonitoring = requireNonNull(sessionMonitoring);
35         executorService = null;
36     }
37
38     public NetconfMonitoringServiceImpl(final NetconfOperationServiceFactory opProvider) {
39         this(opProvider, new NetconfSessionMonitoringService.WithoutUpdates());
40     }
41
42     public NetconfMonitoringServiceImpl(final NetconfOperationServiceFactory opProvider,
43             final ThreadFactory threadFactory, final long period, final TimeUnit timeUnit) {
44         capabilityMonitoring = new NetconfCapabilityMonitoringService(opProvider);
45         if (period > 0) {
46             executorService = Executors.unconfigurableScheduledExecutorService(
47                 // Note: 0 core pool size, as we want to shut the thread down when we do not have listeners
48                 Executors.newScheduledThreadPool(0, threadFactory));
49             sessionMonitoring = new NetconfSessionMonitoringService.WithUpdates(executorService, period, timeUnit);
50         } else {
51             executorService = null;
52             sessionMonitoring = new NetconfSessionMonitoringService.WithoutUpdates();
53         }
54     }
55
56     public NetconfMonitoringServiceImpl(final NetconfOperationServiceFactory opProvider,
57             final ScheduledExecutorService threadPool, final long periodSeconds) {
58         this(opProvider, periodSeconds > 0
59             ? new NetconfSessionMonitoringService.WithUpdates(threadPool, periodSeconds, TimeUnit.SECONDS)
60                 : new NetconfSessionMonitoringService.WithoutUpdates());
61     }
62
63     @Override
64     public Sessions getSessions() {
65         return sessionMonitoring.getSessions();
66     }
67
68     @Override
69     public SessionListener getSessionListener() {
70         return sessionMonitoring;
71     }
72
73     @Override
74     public Schemas getSchemas() {
75         return capabilityMonitoring.getSchemas();
76     }
77
78     @Override
79     public String getSchemaForCapability(final String moduleName, final Optional<String> revision) {
80         return capabilityMonitoring.getSchemaForModuleRevision(moduleName, revision);
81     }
82
83     @Override
84     public Capabilities getCapabilities() {
85         return capabilityMonitoring.getCapabilities();
86     }
87
88     @Override
89     public Registration registerCapabilitiesListener(final CapabilitiesListener listener) {
90         return capabilityMonitoring.registerListener(listener);
91     }
92
93     @Override
94     public Registration registerSessionsListener(final SessionsListener listener) {
95         return sessionMonitoring.registerListener(listener);
96     }
97
98     public void setNotificationPublisher(final BaseNotificationPublisherRegistration notificationPublisher) {
99         capabilityMonitoring.setNotificationPublisher(notificationPublisher);
100     }
101
102     @Override
103     public void close() {
104         capabilityMonitoring.close();
105         sessionMonitoring.close();
106         if (executorService != null) {
107             executorService.shutdown();
108         }
109     }
110 }