2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.controller.netconf.client;
11 import org.opendaylight.controller.netconf.api.NetconfClientSessionPreferences;
12 import org.opendaylight.controller.netconf.api.NetconfMessage;
13 import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage;
14 import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessageAdditionalHeader;
15 import org.opendaylight.controller.netconf.util.messages.NetconfStartExiMessage;
16 import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants;
17 import org.opendaylight.protocol.framework.SessionListenerFactory;
18 import org.opendaylight.protocol.framework.SessionNegotiator;
19 import org.opendaylight.protocol.framework.SessionNegotiatorFactory;
20 import org.openexi.proc.common.AlignmentType;
21 import org.openexi.proc.common.EXIOptions;
22 import org.openexi.proc.common.EXIOptionsException;
24 import com.google.common.base.Optional;
25 import com.google.common.base.Preconditions;
26 import com.google.common.collect.Sets;
28 import io.netty.channel.Channel;
29 import io.netty.util.Timer;
30 import io.netty.util.concurrent.Promise;
32 public class NetconfClientSessionNegotiatorFactory implements SessionNegotiatorFactory<NetconfMessage, NetconfClientSession, NetconfClientSessionListener> {
34 public static final java.util.Set<String> CLIENT_CAPABILITIES = Sets.newHashSet(
35 XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0,
36 XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_1,
37 XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_EXI_1_0);
39 private static final String START_EXI_MESSAGE_ID = "default-start-exi";
41 private final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader;
42 private final long connectionTimeoutMillis;
43 private final Timer timer;
44 private final EXIOptions options;
46 public NetconfClientSessionNegotiatorFactory(Timer timer,
47 Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
48 long connectionTimeoutMillis) {
49 this(timer, additionalHeader, connectionTimeoutMillis, DEFAULT_OPTIONS);
52 public NetconfClientSessionNegotiatorFactory(Timer timer,
53 Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
54 long connectionTimeoutMillis, EXIOptions exiOptions) {
55 this.timer = Preconditions.checkNotNull(timer);
56 this.additionalHeader = additionalHeader;
57 this.connectionTimeoutMillis = connectionTimeoutMillis;
58 this.options = exiOptions;
62 public SessionNegotiator<NetconfClientSession> getSessionNegotiator(SessionListenerFactory<NetconfClientSessionListener> sessionListenerFactory,
64 Promise<NetconfClientSession> promise) {
66 NetconfMessage startExiMessage = NetconfStartExiMessage.create(options, START_EXI_MESSAGE_ID);
67 NetconfHelloMessage helloMessage = NetconfHelloMessage.createClientHello(CLIENT_CAPABILITIES, additionalHeader);
69 NetconfClientSessionPreferences proposal = new NetconfClientSessionPreferences(helloMessage,startExiMessage);
70 return new NetconfClientSessionNegotiator(proposal, promise, channel, timer,
71 sessionListenerFactory.getSessionListener(),connectionTimeoutMillis);
74 private static final EXIOptions DEFAULT_OPTIONS = new EXIOptions();
77 DEFAULT_OPTIONS.setPreserveDTD(true);
78 DEFAULT_OPTIONS.setPreserveNS(true);
79 DEFAULT_OPTIONS.setPreserveLexicalValues(true);
80 DEFAULT_OPTIONS.setAlignmentType(AlignmentType.preCompress);
81 } catch (EXIOptionsException e) {
82 // Should not happen since DEFAULT_OPTIONS are still the same
83 throw new IllegalStateException("Unable to create EXI DEFAULT_OPTIONS");