Merge "Increase timeout for waiting for broker service in sal-binding-it."
[controller.git] / opendaylight / netconf / netconf-impl / src / main / java / org / opendaylight / controller / netconf / impl / NetconfServerSessionNegotiator.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.impl;
10
11 import com.google.common.base.Optional;
12 import io.netty.channel.Channel;
13 import io.netty.util.Timer;
14 import io.netty.util.concurrent.Promise;
15 import org.opendaylight.controller.netconf.api.NetconfMessage;
16 import org.opendaylight.controller.netconf.api.NetconfServerSessionPreferences;
17 import org.opendaylight.controller.netconf.impl.util.AdditionalHeaderUtil;
18 import org.opendaylight.controller.netconf.util.AbstractNetconfSessionNegotiator;
19 import org.opendaylight.protocol.framework.SessionListener;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 import java.net.InetSocketAddress;
24
25 public class NetconfServerSessionNegotiator extends
26         AbstractNetconfSessionNegotiator<NetconfServerSessionPreferences, NetconfServerSession> {
27
28     static final Logger logger = LoggerFactory.getLogger(NetconfServerSessionNegotiator.class);
29
30     protected NetconfServerSessionNegotiator(NetconfServerSessionPreferences sessionPreferences,
31             Promise<NetconfServerSession> promise, Channel channel, Timer timer, SessionListener sessionListener,
32             long connectionTimeoutMillis) {
33         super(sessionPreferences, promise, channel, timer, sessionListener, connectionTimeoutMillis);
34     }
35
36     @Override
37     protected NetconfServerSession getSession(SessionListener sessionListener, Channel channel, NetconfMessage message) {
38         Optional<String> additionalHeader = message.getAdditionalHeader();
39
40         AdditionalHeader parsedHeader;
41         if (additionalHeader.isPresent()) {
42             parsedHeader = AdditionalHeaderUtil.fromString(additionalHeader.get());
43         } else {
44             parsedHeader = new AdditionalHeader("unknown", ((InetSocketAddress)channel.localAddress()).getHostString(),
45                     "tcp", "client");
46         }
47         logger.debug("Additional header from hello parsed as {} from {}", parsedHeader, additionalHeader);
48
49         return new NetconfServerSession(sessionListener, channel, sessionPreferences.getSessionId(), parsedHeader);
50     }
51
52     public static class AdditionalHeader {
53
54         private final String username;
55         private final String address;
56         private final String transport;
57         private final String sessionIdentifier;
58
59         public AdditionalHeader(String userName, String hostAddress, String transport, String sessionIdentifier) {
60             this.address = hostAddress;
61             this.username = userName;
62             this.transport = transport;
63             this.sessionIdentifier = sessionIdentifier;
64         }
65
66         String getUsername() {
67             return username;
68         }
69
70         String getAddress() {
71             return address;
72         }
73
74         String getTransport() {
75             return transport;
76         }
77
78         String getSessionType() {
79             return sessionIdentifier;
80         }
81
82         @Override
83         public String toString() {
84             final StringBuffer sb = new StringBuffer("AdditionalHeader{");
85             sb.append("username='").append(username).append('\'');
86             sb.append(", address='").append(address).append('\'');
87             sb.append(", transport='").append(transport).append('\'');
88             sb.append('}');
89             return sb.toString();
90         }
91     }
92
93 }