Eliminate GlobalNetconfSshScheduledExecutor
[netconf.git] / apps / netconf-nb / src / main / java / org / opendaylight / netconf / northbound / OSGiNetconfServer.java
1 /*
2  * Copyright (c) 2023 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.northbound;
9
10 import static com.google.common.base.Verify.verifyNotNull;
11 import static java.util.Objects.requireNonNull;
12
13 import io.netty.util.Timer;
14 import java.util.Map;
15 import org.opendaylight.netconf.server.NetconfServerSessionNegotiatorFactory;
16 import org.opendaylight.netconf.server.ServerTransportInitializer;
17 import org.opendaylight.netconf.server.api.SessionIdProvider;
18 import org.opendaylight.netconf.server.api.operations.NetconfOperationServiceFactory;
19 import org.opendaylight.netconf.server.osgi.AggregatedNetconfOperationServiceFactory;
20 import org.osgi.framework.FrameworkUtil;
21 import org.osgi.service.component.ComponentFactory;
22 import org.osgi.service.component.ComponentInstance;
23 import org.osgi.service.component.annotations.Activate;
24 import org.osgi.service.component.annotations.Component;
25 import org.osgi.service.component.annotations.Deactivate;
26 import org.osgi.service.component.annotations.Reference;
27 import org.osgi.service.metatype.annotations.AttributeDefinition;
28 import org.osgi.service.metatype.annotations.Designate;
29 import org.osgi.service.metatype.annotations.ObjectClassDefinition;
30
31 @Component(service = { OSGiNetconfServer.class }, configurationPid = "org.opendaylight.netconf.impl")
32 @Designate(ocd = OSGiNetconfServer.Configuration.class)
33 public final class OSGiNetconfServer {
34     @ObjectClassDefinition
35     public @interface Configuration {
36         @AttributeDefinition(min = "0")
37         long connection$_$timeout$_$millis() default 20000;
38         @AttributeDefinition
39         long monitoring$_$update$_$interval() default 6;
40     }
41
42     private final AggregatedNetconfOperationServiceFactory mappers = new AggregatedNetconfOperationServiceFactory();
43     private final ComponentInstance<DefaultNetconfMonitoringService> monitoring;
44     private final ServerTransportInitializer serverTransportInitializer;
45
46     @Activate
47     public OSGiNetconfServer(
48             @Reference(target = "(component.factory=" + DefaultNetconfMonitoringService.FACTORY_NAME + ")")
49             final ComponentFactory<DefaultNetconfMonitoringService> monitoringFactory,
50             @Reference(target = "(type=mapper-aggregator-registry)")
51             final NetconfOperationServiceFactory mapperAggregatorRegistry,
52             @Reference(target = "(type=global-timer)") final Timer timer,
53             @Reference final SessionIdProvider sessionIdProvider,
54             final Configuration configuration) {
55         mappers.onAddNetconfOperationServiceFactory(mapperAggregatorRegistry);
56         monitoring = monitoringFactory.newInstance(FrameworkUtil.asDictionary(DefaultNetconfMonitoringService.props(
57             mapperAggregatorRegistry, configuration.monitoring$_$update$_$interval())));
58         serverTransportInitializer = new ServerTransportInitializer(NetconfServerSessionNegotiatorFactory.builder()
59             .setTimer(timer)
60             .setAggregatedOpService(mappers)
61             .setIdProvider(sessionIdProvider)
62             .setConnectionTimeoutMillis(configuration.connection$_$timeout$_$millis())
63             .setMonitoringService(monitoring.getInstance())
64             .build());
65     }
66
67     @Deactivate
68     public void deactivate() {
69         monitoring.dispose();
70         mappers.close();
71     }
72
73     ServerTransportInitializer serverTransportInitializer() {
74         return serverTransportInitializer;
75     }
76
77     static <T> T extractProp(final Map<String, ?> properties, final String key, final Class<T> valueType) {
78         return valueType.cast(verifyNotNull(properties.get(requireNonNull(key))));
79     }
80 }