X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Futil%2Fmessages%2FNetconfHelloMessageAdditionalHeader.java;fp=opendaylight%2Fnetconf%2Fnetconf-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Futil%2Fmessages%2FNetconfHelloMessageAdditionalHeader.java;h=f3ca30d2c40a4f924b0b35b5d196ba53295acb57;hb=15863b438cff589c647169776f876c330e2cd651;hp=0000000000000000000000000000000000000000;hpb=38500d0f0e22f84bf31618d8b5e9aab37fdb897c;p=controller.git diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfHelloMessageAdditionalHeader.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfHelloMessageAdditionalHeader.java new file mode 100644 index 0000000000..f3ca30d2c4 --- /dev/null +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfHelloMessageAdditionalHeader.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.netconf.util.messages; + +import com.google.common.base.Preconditions; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Additional header can be used with hello message to carry information about + * session's connection. Provided information can be reported via netconf + * monitoring. + *
+ * It has pattern "[username; host-address:port; transport; session-identifier;]"
+ * username - name of account on a remote
+ * host-address - client's IP address
+ * port - port number
+ * transport - tcp, ssh
+ * session-identifier - persister, client
+ * Session-identifier is optional, others mandatory.
+ * 
+ * This header is inserted in front of a netconf hello message followed by a newline. + */ +public class NetconfHelloMessageAdditionalHeader { + + private static final String SC = ";"; + + private final String userName; + private final String hostAddress; + private final String port; + private final String transport; + private final String sessionIdentifier; + + public NetconfHelloMessageAdditionalHeader(String userName, String hostAddress, String port, String transport, String sessionIdentifier) { + this.userName = userName; + this.hostAddress = hostAddress; + this.port = port; + this.transport = transport; + this.sessionIdentifier = sessionIdentifier; + } + + public String getUserName() { + return userName; + } + + public String getAddress() { + return hostAddress; + } + + public String getPort() { + return port; + } + + public String getTransport() { + return transport; + } + + public String getSessionIdentifier() { + return sessionIdentifier; + } + + /** + * Format additional header into a string suitable as a prefix for netconf hello message + */ + public String toFormattedString() { + Preconditions.checkNotNull(userName); + Preconditions.checkNotNull(hostAddress); + Preconditions.checkNotNull(port); + Preconditions.checkNotNull(transport); + Preconditions.checkNotNull(sessionIdentifier); + return "[" + userName + SC + hostAddress + ":" + port + SC + transport + SC + sessionIdentifier + SC + "]" + + System.lineSeparator(); + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("NetconfHelloMessageAdditionalHeader{"); + sb.append("userName='").append(userName).append('\''); + sb.append(", hostAddress='").append(hostAddress).append('\''); + sb.append(", port='").append(port).append('\''); + sb.append(", transport='").append(transport).append('\''); + sb.append(", sessionIdentifier='").append(sessionIdentifier).append('\''); + sb.append('}'); + return sb.toString(); + } + + // TODO IPv6 + private static final Pattern pattern = Pattern + .compile("\\[(?[^;]+);(?
[0-9\\.]+)[:/](?[0-9]+);(?[a-z]+)[^\\]]+\\]"); + private static final Pattern customHeaderPattern = Pattern + .compile("\\[(?[^;]+);(?
[0-9\\.]+)[:/](?[0-9]+);(?[a-z]+);(?[a-z]+)[^\\]]+\\]"); + + /** + * Parse additional header from a formatted string + */ + public static NetconfHelloMessageAdditionalHeader fromString(String additionalHeader) { + additionalHeader = additionalHeader.trim(); + Matcher matcher = pattern.matcher(additionalHeader); + Matcher matcher2 = customHeaderPattern.matcher(additionalHeader); + Preconditions.checkArgument(matcher.matches(), "Additional header in wrong format %s, expected %s", + additionalHeader, pattern); + + String username = matcher.group("username"); + String address = matcher.group("address"); + String port = matcher.group("port"); + String transport = matcher.group("transport"); + String sessionIdentifier = "client"; + if (matcher2.matches()) { + sessionIdentifier = matcher2.group("sessionIdentifier"); + } + return new NetconfHelloMessageAdditionalHeader(username, address, port, transport, sessionIdentifier); + } + +}