Merge "Fixed typo in SnapshotBackedWriteTransaction class"
[controller.git] / opendaylight / netconf / netconf-client / src / main / java / org / opendaylight / controller / netconf / client / NetconfClientDispatcherImpl.java
1 /*
2  * Copyright (c) 2013 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
9 package org.opendaylight.controller.netconf.client;
10
11 import java.io.Closeable;
12
13 import org.opendaylight.controller.netconf.client.conf.NetconfClientConfiguration;
14 import org.opendaylight.controller.netconf.client.conf.NetconfReconnectingClientConfiguration;
15 import org.opendaylight.protocol.framework.AbstractDispatcher;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18
19 import io.netty.channel.EventLoopGroup;
20 import io.netty.channel.socket.SocketChannel;
21 import io.netty.util.Timer;
22 import io.netty.util.concurrent.Future;
23 import io.netty.util.concurrent.Promise;
24
25 public class NetconfClientDispatcherImpl extends AbstractDispatcher<NetconfClientSession, NetconfClientSessionListener>
26         implements NetconfClientDispatcher, Closeable {
27
28     private static final Logger logger = LoggerFactory.getLogger(NetconfClientDispatcherImpl.class);
29
30     private final Timer timer;
31
32     public NetconfClientDispatcherImpl(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup, final Timer timer) {
33         super(bossGroup, workerGroup);
34         this.timer = timer;
35     }
36
37     @Override
38     public Future<NetconfClientSession> createClient(final NetconfClientConfiguration clientConfiguration) {
39         switch (clientConfiguration.getProtocol()) {
40         case TCP:
41             return createTcpClient(clientConfiguration);
42         case SSH:
43             return createSshClient(clientConfiguration);
44         }
45         throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
46     }
47
48     @Override
49     public Future<Void> createReconnectingClient(final NetconfReconnectingClientConfiguration clientConfiguration) {
50         switch (clientConfiguration.getProtocol()) {
51             case TCP: return createReconnectingTcpClient(clientConfiguration);
52             case SSH: return createReconnectingSshClient(clientConfiguration);
53             default: throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
54         }
55     }
56
57     private Future<NetconfClientSession> createTcpClient(final NetconfClientConfiguration currentConfiguration) {
58         logger.debug("Creating TCP client with configuration: {}", currentConfiguration);
59         return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
60                 new PipelineInitializer<NetconfClientSession>() {
61
62                     @Override
63                     public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
64                         initialize(ch, promise);
65                     }
66
67                     private void initialize(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
68                         new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration), currentConfiguration
69                                 .getSessionListener()).initialize(ch, promise);
70                     }
71                 });
72     }
73
74     private Future<Void> createReconnectingTcpClient(final NetconfReconnectingClientConfiguration currentConfiguration) {
75         logger.debug("Creating reconnecting TCP client with configuration: {}", currentConfiguration);
76         final TcpClientChannelInitializer init = new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration),
77                 currentConfiguration.getSessionListener());
78
79         return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration.getConnectStrategyFactory(),
80                 currentConfiguration.getReconnectStrategy(), new PipelineInitializer<NetconfClientSession>() {
81                     @Override
82                     public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
83                         init.initialize(ch, promise);
84                     }
85                 });
86     }
87
88     private Future<NetconfClientSession> createSshClient(final NetconfClientConfiguration currentConfiguration) {
89         logger.debug("Creating SSH client with configuration: {}", currentConfiguration);
90         return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
91                 new PipelineInitializer<NetconfClientSession>() {
92
93                     @Override
94                     public void initializeChannel(final SocketChannel ch,
95                                                   final Promise<NetconfClientSession> sessionPromise) {
96                         new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
97                                 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener())
98                                 .initialize(ch, sessionPromise);
99                     }
100
101                 });
102     }
103
104     private Future<Void> createReconnectingSshClient(final NetconfReconnectingClientConfiguration currentConfiguration) {
105         logger.debug("Creating reconnecting SSH client with configuration: {}", currentConfiguration);
106         final SshClientChannelInitializer init = new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
107                 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener());
108
109         return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration.getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
110                 new PipelineInitializer<NetconfClientSession>() {
111                     @Override
112                     public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
113                         init.initialize(ch, promise);
114                     }
115                 });
116     }
117
118     protected NetconfClientSessionNegotiatorFactory getNegotiatorFactory(final NetconfClientConfiguration cfg) {
119         return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
120                 cfg.getConnectionTimeoutMillis());
121     }
122 }