Refresh IETF client/server models
[netconf.git] / protocol / netconf-client / src / main / java / org / opendaylight / netconf / client / conf / NetconfClientConfigurationBuilder.java
1 /*
2  * Copyright (c) 2014 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.client.conf;
9
10 import static com.google.common.base.Preconditions.checkArgument;
11
12 import java.util.List;
13 import org.checkerframework.checker.index.qual.NonNegative;
14 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
15 import org.opendaylight.netconf.client.NetconfClientSessionListener;
16 import org.opendaylight.netconf.nettyutil.NetconfSessionNegotiator;
17 import org.opendaylight.netconf.transport.ssh.ClientFactoryManagerConfigurator;
18 import org.opendaylight.netconf.transport.tls.SslHandlerFactory;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ssh.client.rev240208.SshClientGrouping;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.tcp.client.rev240208.TcpClientGrouping;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.tls.client.rev240208.TlsClientGrouping;
23
24 /**
25  * Builder for {@link NetconfClientConfiguration}.
26  */
27 public final class NetconfClientConfigurationBuilder {
28     public static final int DEFAULT_CONNECTION_TIMEOUT_MILLIS = 5000;
29     public static final NetconfClientConfiguration.NetconfClientProtocol DEFAULT_CLIENT_PROTOCOL =
30         NetconfClientConfiguration.NetconfClientProtocol.TCP;
31
32     private long connectionTimeoutMillis = DEFAULT_CONNECTION_TIMEOUT_MILLIS;
33     private @NonNegative int maximumIncomingChunkSize =
34         NetconfSessionNegotiator.DEFAULT_MAXIMUM_INCOMING_CHUNK_SIZE;
35     private NetconfHelloMessageAdditionalHeader additionalHeader;
36     private NetconfClientSessionListener sessionListener;
37     private NetconfClientConfiguration.NetconfClientProtocol clientProtocol = DEFAULT_CLIENT_PROTOCOL;
38     private List<Uri> odlHelloCapabilities;
39     private String name;
40     private TcpClientGrouping tcpParameters;
41     private TlsClientGrouping tlsParameters;
42     private SslHandlerFactory sslHandlerFactory;
43     private SshClientGrouping sshParameters;
44     private ClientFactoryManagerConfigurator sshConfigurator;
45
46     private NetconfClientConfigurationBuilder() {
47         // on purpose
48     }
49
50     public static NetconfClientConfigurationBuilder create() {
51         return new NetconfClientConfigurationBuilder();
52     }
53
54     /**
55      * Set connection timeout value in milliseconds.
56      *
57      * @param connectionTimeoutMillis value
58      * @return current builder instance
59      */
60     @SuppressWarnings("checkstyle:hiddenField")
61     public NetconfClientConfigurationBuilder withConnectionTimeoutMillis(final long connectionTimeoutMillis) {
62         this.connectionTimeoutMillis = connectionTimeoutMillis;
63         return this;
64     }
65
66     /**
67      * Set client protocol.
68      *
69      * @param clientProtocol client protocol
70      * @return current builder instance
71      */
72     @SuppressWarnings("checkstyle:hiddenField")
73     public NetconfClientConfigurationBuilder withProtocol(
74             final NetconfClientConfiguration.NetconfClientProtocol clientProtocol) {
75         this.clientProtocol = clientProtocol;
76         return this;
77     }
78
79     /**
80      * Set additional header for Hello message.
81      *
82      * @param additionalHeader additional header
83      * @return current builder instance
84      */
85     @SuppressWarnings("checkstyle:hiddenField")
86     public NetconfClientConfigurationBuilder withAdditionalHeader(
87             final NetconfHelloMessageAdditionalHeader additionalHeader) {
88         this.additionalHeader = additionalHeader;
89         return this;
90     }
91
92     /**
93      * Set NETCONF session client listener.
94      *
95      * @param sessionListener session listener
96      * @return current builder instance
97      */
98     @SuppressWarnings("checkstyle:hiddenField")
99     public NetconfClientConfigurationBuilder withSessionListener(final NetconfClientSessionListener sessionListener) {
100         this.sessionListener = sessionListener;
101         return this;
102     }
103
104     /**
105      * Set client name.
106      *
107      * @param name value
108      * @return current builder instance
109      */
110     @SuppressWarnings("checkstyle:hiddenField")
111     public NetconfClientConfigurationBuilder withName(final String name) {
112         this.name = name;
113         return this;
114     }
115
116     /**
117      * Set capabilities for Hello message.
118      *
119      * @param odlHelloCapabilities capabilities
120      * @return current builder instance
121      */
122     @SuppressWarnings("checkstyle:hiddenField")
123     public NetconfClientConfigurationBuilder withOdlHelloCapabilities(final List<Uri> odlHelloCapabilities) {
124         this.odlHelloCapabilities = odlHelloCapabilities;
125         return this;
126     }
127
128     /**
129      * Set max size of incoming data chink in bytes. Positive value is required.
130      *
131      * @param maximumIncomingChunkSize value
132      * @return current builder instance
133      * @throws IllegalArgumentException if value zero or less
134      */
135     @SuppressWarnings("checkstyle:hiddenField")
136     public NetconfClientConfigurationBuilder withMaximumIncomingChunkSize(
137             final @NonNegative int maximumIncomingChunkSize) {
138         checkArgument(maximumIncomingChunkSize > 0);
139         this.maximumIncomingChunkSize = maximumIncomingChunkSize;
140         return this;
141     }
142
143     /**
144      * Set TCP client transport parameters.
145      *
146      * @param tcpParameters parameters
147      * @return current builder instance
148      */
149     @SuppressWarnings("checkstyle:hiddenField")
150     public NetconfClientConfigurationBuilder withTcpParameters(final TcpClientGrouping tcpParameters) {
151         this.tcpParameters = tcpParameters;
152         return this;
153     }
154
155     /**
156      * Set TLS client transport parameters.
157      *
158      * @param tlsParameters parameters
159      * @return current builder instance
160      */
161     @SuppressWarnings("checkstyle:hiddenField")
162     public NetconfClientConfigurationBuilder withTlsParameters(final TlsClientGrouping tlsParameters) {
163         this.tlsParameters = tlsParameters;
164         return this;
165     }
166
167     /**
168      * Set SslHandlerFactory for TLS transport.
169      *
170      * @param sslHandlerFactory ssl handler factory
171      * @return current builder instance
172      */
173     @SuppressWarnings("checkstyle:hiddenField")
174     public NetconfClientConfigurationBuilder withSslHandlerFactory(final SslHandlerFactory sslHandlerFactory) {
175         this.sslHandlerFactory = sslHandlerFactory;
176         return this;
177     }
178
179     /**
180      * Set SSH client transport parameters.
181      *
182      * @param sshParameters SSH parameters
183      * @return current builder instance
184      */
185     @SuppressWarnings("checkstyle:hiddenField")
186     public NetconfClientConfigurationBuilder withSshParameters(final SshClientGrouping sshParameters) {
187         this.sshParameters = sshParameters;
188         return this;
189     }
190
191     /**
192      * Set SSH Client Factory Manager configurator.
193      *
194      * @param sshConfigurator configurator
195      * @return current builder instance
196      */
197     @SuppressWarnings("checkstyle:hiddenField")
198     public NetconfClientConfigurationBuilder withSshConfigurator(
199             final ClientFactoryManagerConfigurator sshConfigurator) {
200         this.sshConfigurator = sshConfigurator;
201         return this;
202     }
203
204     /**
205      * Builds configuration based on parameters provided.
206      *
207      * @return immutable configuration instance
208      */
209     public NetconfClientConfiguration build() {
210         return new NetconfClientConfiguration(clientProtocol, tcpParameters, tlsParameters, sslHandlerFactory,
211                 sshParameters, sshConfigurator, sessionListener, odlHelloCapabilities, connectionTimeoutMillis,
212                 maximumIncomingChunkSize, additionalHeader, name);
213     }
214 }