Fix Java 5 IDE migration warnings
[netconf.git] / netconf / netconf-api / src / main / java / org / opendaylight / netconf / api / messages / NetconfHelloMessageAdditionalHeader.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.netconf.api.messages;
10
11 import com.google.common.base.Preconditions;
12 import com.google.common.net.InetAddresses;
13 import java.util.regex.Matcher;
14 import java.util.regex.Pattern;
15
16 /**
17  * Additional header can be used with hello message to carry information about
18  * session's connection. Provided information can be reported via netconf
19  * monitoring.
20  * <pre>
21  * It has PATTERN "[username; host-address:port; transport; session-identifier;]"
22  * username - name of account on a remote
23  * host-address - client's IP address
24  * port - port number
25  * transport - tcp, ssh
26  * session-identifier - persister, client
27  * Session-identifier is optional, others mandatory.
28  * </pre>
29  * This header is inserted in front of a netconf hello message followed by a newline.
30  */
31 public class NetconfHelloMessageAdditionalHeader {
32
33     private static final String SC = ";";
34
35     private final String userName;
36     private final String hostAddress;
37     private final String port;
38     private final String transport;
39     private final String sessionIdentifier;
40
41     public NetconfHelloMessageAdditionalHeader(String userName, String hostAddress, String port,
42                                                String transport, String sessionIdentifier) {
43         this.userName = userName;
44         this.hostAddress = hostAddress;
45         this.port = port;
46         this.transport = transport;
47         this.sessionIdentifier = sessionIdentifier;
48     }
49
50     public String getUserName() {
51         return userName;
52     }
53
54     public String getAddress() {
55         return hostAddress;
56     }
57
58     public String getPort() {
59         return port;
60     }
61
62     public String getTransport() {
63         return transport;
64     }
65
66     public String getSessionIdentifier() {
67         return sessionIdentifier;
68     }
69
70     /**
71      * Format additional header into a string suitable as a prefix for netconf hello message.
72      */
73     public String toFormattedString() {
74         Preconditions.checkNotNull(userName);
75         Preconditions.checkNotNull(hostAddress);
76         Preconditions.checkNotNull(port);
77         Preconditions.checkNotNull(transport);
78         Preconditions.checkNotNull(sessionIdentifier);
79         return "[" + userName + SC + hostAddress + ":" + port + SC + transport + SC + sessionIdentifier + SC + "]"
80                 + System.lineSeparator();
81     }
82
83     @Override
84     public String toString() {
85         final StringBuilder sb = new StringBuilder("NetconfHelloMessageAdditionalHeader{");
86         sb.append("userName='").append(userName).append('\'');
87         sb.append(", hostAddress='").append(hostAddress).append('\'');
88         sb.append(", port='").append(port).append('\'');
89         sb.append(", transport='").append(transport).append('\'');
90         sb.append(", sessionIdentifier='").append(sessionIdentifier).append('\'');
91         sb.append('}');
92         return sb.toString();
93     }
94
95     private static final Pattern PATTERN = Pattern
96             .compile("\\[(?<username>[^;]+);(?<address>.+)[:/](?<port>[0-9]+);(?<transport>[a-z]+)[^\\]]+\\]");
97     private static final Pattern CUSTOM_HEADER_PATTERN = Pattern
98             .compile("\\[(?<username>[^;]+);"
99                     + "(?<address>.+)[:/](?<port>[0-9]+);(?<transport>[a-z]+);(?<sessionIdentifier>[a-z]+)[^\\]]+\\]");
100
101     /**
102      * Parse additional header from a formatted string.
103      */
104     public static NetconfHelloMessageAdditionalHeader fromString(String additionalHeader) {
105         String additionalHeaderTrimmed = additionalHeader.trim();
106         Matcher matcher = PATTERN.matcher(additionalHeaderTrimmed);
107         Matcher matcher2 = CUSTOM_HEADER_PATTERN.matcher(additionalHeaderTrimmed);
108         Preconditions.checkArgument(matcher.matches(), "Additional header in wrong format %s, expected %s",
109                 additionalHeaderTrimmed, PATTERN);
110
111         String username = matcher.group("username");
112         String address = matcher.group("address");
113         Preconditions.checkArgument(InetAddresses.isInetAddress(address));
114         String port = matcher.group("port");
115         String transport = matcher.group("transport");
116         String sessionIdentifier = "client";
117         if (matcher2.matches()) {
118             sessionIdentifier = matcher2.group("sessionIdentifier");
119         }
120         return new NetconfHelloMessageAdditionalHeader(username, address, port, transport, sessionIdentifier);
121     }
122
123 }