8a8cb2927d618e09365b995dbe82b816202f2bfa
[netconf.git] / netconf / netconf-client / src / main / java / org / opendaylight / netconf / client / NetconfClientSessionNegotiatorFactory.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 package org.opendaylight.netconf.client;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.collect.ImmutableSet;
13 import io.netty.channel.Channel;
14 import io.netty.util.Timer;
15 import io.netty.util.concurrent.Promise;
16 import java.util.Optional;
17 import java.util.Set;
18 import org.opendaylight.netconf.api.NetconfSessionListenerFactory;
19 import org.opendaylight.netconf.api.messages.NetconfHelloMessage;
20 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
21 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
22 import org.opendaylight.netconf.nettyutil.NetconfSessionNegotiatorFactory;
23 import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters;
24 import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage;
25 import org.opendaylight.netconf.shaded.exificient.core.CodingMode;
26 import org.opendaylight.netconf.shaded.exificient.core.FidelityOptions;
27 import org.opendaylight.netconf.shaded.exificient.core.exceptions.UnsupportedOption;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 public class NetconfClientSessionNegotiatorFactory
32         implements NetconfSessionNegotiatorFactory<NetconfClientSession, NetconfClientSessionListener> {
33
34     public static final Set<String> EXI_CLIENT_CAPABILITIES = ImmutableSet.of(
35             XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0,
36             XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1,
37             XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_EXI_1_0);
38
39     public static final Set<String> LEGACY_EXI_CLIENT_CAPABILITIES = ImmutableSet.of(
40             XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0,
41             XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_EXI_1_0);
42
43     public static final Set<String> DEFAULT_CLIENT_CAPABILITIES = ImmutableSet.of(
44             XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0,
45             XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1);
46
47     public static final Set<String> LEGACY_FRAMING_CLIENT_CAPABILITIES = ImmutableSet.of(
48             XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0);
49
50     private static final Logger LOG = LoggerFactory.getLogger(NetconfClientSessionNegotiatorFactory.class);
51     private static final String START_EXI_MESSAGE_ID = "default-start-exi";
52     private static final EXIParameters DEFAULT_OPTIONS;
53
54     static {
55         final FidelityOptions fidelity = FidelityOptions.createDefault();
56         try {
57             fidelity.setFidelity(FidelityOptions.FEATURE_DTD, true);
58             fidelity.setFidelity(FidelityOptions.FEATURE_LEXICAL_VALUE, true);
59             fidelity.setFidelity(FidelityOptions.FEATURE_PREFIX, true);
60         } catch (UnsupportedOption e) {
61             LOG.warn("Failed to set fidelity options, continuing", e);
62         }
63
64         DEFAULT_OPTIONS = new EXIParameters(CodingMode.BYTE_PACKED, fidelity);
65     }
66
67     private final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader;
68     private final Set<String> clientCapabilities;
69     private final long connectionTimeoutMillis;
70     private final Timer timer;
71     private final EXIParameters options;
72
73     public NetconfClientSessionNegotiatorFactory(final Timer timer,
74                                                  final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
75                                                  final long connectionTimeoutMillis) {
76         this(timer, additionalHeader, connectionTimeoutMillis, DEFAULT_OPTIONS);
77     }
78
79     public NetconfClientSessionNegotiatorFactory(final Timer timer,
80                                                  final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
81                                                  final long connectionTimeoutMillis, final Set<String> capabilities) {
82         this(timer, additionalHeader, connectionTimeoutMillis, DEFAULT_OPTIONS, capabilities);
83
84     }
85
86     public NetconfClientSessionNegotiatorFactory(final Timer timer,
87                                                  final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
88                                                  final long connectionTimeoutMillis, final EXIParameters exiOptions) {
89         this(timer, additionalHeader, connectionTimeoutMillis, exiOptions, EXI_CLIENT_CAPABILITIES);
90     }
91
92     public NetconfClientSessionNegotiatorFactory(final Timer timer,
93                                                  final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
94                                                  final long connectionTimeoutMillis, final EXIParameters exiOptions,
95                                                  final Set<String> capabilities) {
96         this.timer = requireNonNull(timer);
97         this.additionalHeader = additionalHeader;
98         this.connectionTimeoutMillis = connectionTimeoutMillis;
99         options = exiOptions;
100         clientCapabilities = capabilities;
101     }
102
103     public long getConnectionTimeoutMillis() {
104         return connectionTimeoutMillis;
105     }
106
107     @Override
108     public NetconfClientSessionNegotiator getSessionNegotiator(
109             final NetconfSessionListenerFactory<NetconfClientSessionListener> sessionListenerFactory,
110             final Channel channel, final Promise<NetconfClientSession> promise) {
111         return new NetconfClientSessionNegotiator(
112             NetconfHelloMessage.createClientHello(clientCapabilities, additionalHeader),
113             NetconfStartExiMessage.create(options, START_EXI_MESSAGE_ID), promise, channel, timer,
114                 sessionListenerFactory.getSessionListener(), connectionTimeoutMillis);
115     }
116 }