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
8 package org.opendaylight.netconf.api.messages;
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.net.InetAddresses;
14 import java.util.regex.Matcher;
15 import java.util.regex.Pattern;
18 * Additional header can be used with hello message to carry information about
19 * session's connection. Provided information can be reported via netconf
22 * It has PATTERN "[username; host-address:port; transport; session-identifier;]"
23 * username - name of account on a remote
24 * host-address - client's IP address
26 * transport - tcp, ssh
27 * session-identifier - persister, client
28 * Session-identifier is optional, others mandatory.
30 * This header is inserted in front of a netconf hello message followed by a newline.
32 public class NetconfHelloMessageAdditionalHeader {
34 private static final String SC = ";";
36 private final String userName;
37 private final String hostAddress;
38 private final String port;
39 private final String transport;
40 private final String sessionIdentifier;
42 public NetconfHelloMessageAdditionalHeader(final String userName, final String hostAddress, final String port,
43 final String transport, final String sessionIdentifier) {
44 this.userName = userName;
45 this.hostAddress = hostAddress;
47 this.transport = transport;
48 this.sessionIdentifier = sessionIdentifier;
51 public String getUserName() {
55 public String getAddress() {
59 public String getPort() {
63 public String getTransport() {
67 public String getSessionIdentifier() {
68 return sessionIdentifier;
72 * Format additional header into a string suitable as a prefix for netconf hello message.
74 public String toFormattedString() {
75 requireNonNull(userName);
76 requireNonNull(hostAddress);
78 requireNonNull(transport);
79 requireNonNull(sessionIdentifier);
80 return "[" + userName + SC + hostAddress + ":" + port + SC + transport + SC + sessionIdentifier + SC + "]"
81 + System.lineSeparator();
85 public String toString() {
86 final StringBuilder sb = new StringBuilder("NetconfHelloMessageAdditionalHeader{");
87 sb.append("userName='").append(userName).append('\'');
88 sb.append(", hostAddress='").append(hostAddress).append('\'');
89 sb.append(", port='").append(port).append('\'');
90 sb.append(", transport='").append(transport).append('\'');
91 sb.append(", sessionIdentifier='").append(sessionIdentifier).append('\'');
96 private static final Pattern PATTERN = Pattern
97 .compile("\\[(?<username>[^;]+);(?<address>.+)[:/](?<port>[0-9]+);(?<transport>[a-z]+)[^\\]]+\\]");
98 private static final Pattern CUSTOM_HEADER_PATTERN = Pattern
99 .compile("\\[(?<username>[^;]+);"
100 + "(?<address>.+)[:/](?<port>[0-9]+);(?<transport>[a-z]+);(?<sessionIdentifier>[a-z]+)[^\\]]+\\]");
103 * Parse additional header from a formatted string.
105 public static NetconfHelloMessageAdditionalHeader fromString(final String additionalHeader) {
106 String additionalHeaderTrimmed = additionalHeader.trim();
107 Matcher matcher = PATTERN.matcher(additionalHeaderTrimmed);
108 Matcher matcher2 = CUSTOM_HEADER_PATTERN.matcher(additionalHeaderTrimmed);
109 checkArgument(matcher.matches(), "Additional header in wrong format %s, expected %s",
110 additionalHeaderTrimmed, PATTERN);
112 String username = matcher.group("username");
113 String address = matcher.group("address");
114 checkArgument(InetAddresses.isInetAddress(address));
115 String port = matcher.group("port");
116 String transport = matcher.group("transport");
117 String sessionIdentifier = "client";
118 if (matcher2.matches()) {
119 sessionIdentifier = matcher2.group("sessionIdentifier");
121 return new NetconfHelloMessageAdditionalHeader(username, address, port, transport, sessionIdentifier);