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