X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Futil%2Fhandler%2FNetconfXMLToHelloMessageDecoder.java;h=248871a7aa3b4b6f3c60efffae0022791dad4624;hp=42586a5ecc60433d28a8fa89bbe57d3e958fdee1;hb=c74edd02f5044772f226cea9da9967023f6842d6;hpb=5e035029b351317b24cf2dfb45504bf5a830d2d1 diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfXMLToHelloMessageDecoder.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfXMLToHelloMessageDecoder.java index 42586a5ecc..248871a7aa 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfXMLToHelloMessageDecoder.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfXMLToHelloMessageDecoder.java @@ -7,6 +7,12 @@ */ package org.opendaylight.controller.netconf.util.handler; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.io.ByteArrayInputStream; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.List; @@ -14,8 +20,12 @@ import java.util.List; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage; import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessageAdditionalHeader; +import org.opendaylight.controller.netconf.util.xml.XmlUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.w3c.dom.Document; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Charsets; import com.google.common.collect.ImmutableList; @@ -25,7 +35,8 @@ import com.google.common.collect.ImmutableList; * {@link org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage} * . Used by netconf server to retrieve information about session metadata. */ -public class NetconfXMLToHelloMessageDecoder extends NetconfXMLToMessageDecoder { +public final class NetconfXMLToHelloMessageDecoder extends ByteToMessageDecoder { + private static final Logger LOG = LoggerFactory.getLogger(NetconfXMLToHelloMessageDecoder.class); private static final List POSSIBLE_ENDS = ImmutableList.of( new byte[] { ']', '\n' }, @@ -35,34 +46,46 @@ public class NetconfXMLToHelloMessageDecoder extends NetconfXMLToMessageDecoder new byte[] { '\r', '\n', '[' }, new byte[] { '\n', '[' }); - private String additionalHeaderCache; - @Override - protected byte[] preprocessMessageBytes(byte[] bytes) { - // Extract bytes containing header with additional metadata - - if (startsWithAdditionalHeader(bytes)) { - // Auth information containing username, ip address... extracted for monitoring - int endOfAuthHeader = getAdditionalHeaderEndIndex(bytes); - if (endOfAuthHeader > -1) { - byte[] additionalHeaderBytes = Arrays.copyOfRange(bytes, 0, endOfAuthHeader + 2); - additionalHeaderCache = additionalHeaderToString(additionalHeaderBytes); - bytes = Arrays.copyOfRange(bytes, endOfAuthHeader + 2, bytes.length); - } + @VisibleForTesting + public void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { + if (in.readableBytes() == 0) { + LOG.debug("No more content in incoming buffer."); + return; } - return bytes; - } + in.markReaderIndex(); + try { + LOG.trace("Received to decode: {}", ByteBufUtil.hexDump(in)); + byte[] bytes = new byte[in.readableBytes()]; + in.readBytes(bytes); + + logMessage(bytes); + + // Extract bytes containing header with additional metadata + String additionalHeader = null; + if (startsWithAdditionalHeader(bytes)) { + // Auth information containing username, ip address... extracted for monitoring + int endOfAuthHeader = getAdditionalHeaderEndIndex(bytes); + if (endOfAuthHeader > -1) { + byte[] additionalHeaderBytes = Arrays.copyOfRange(bytes, 0, endOfAuthHeader + 2); + additionalHeader = additionalHeaderToString(additionalHeaderBytes); + bytes = Arrays.copyOfRange(bytes, endOfAuthHeader + 2, bytes.length); + } + } - @Override - protected void cleanUpAfterDecode() { - additionalHeaderCache = null; - } + Document doc = XmlUtil.readXmlToDocument(new ByteArrayInputStream(bytes)); - @Override - protected NetconfMessage buildNetconfMessage(Document doc) { - return new NetconfHelloMessage(doc, additionalHeaderCache == null ? null - : NetconfHelloMessageAdditionalHeader.fromString(additionalHeaderCache)); + final NetconfMessage message; + if (additionalHeader != null) { + message = new NetconfHelloMessage(doc, NetconfHelloMessageAdditionalHeader.fromString(additionalHeader)); + } else { + message = new NetconfHelloMessage(doc); + } + out.add(message); + } finally { + in.discardReadBytes(); + } } private int getAdditionalHeaderEndIndex(byte[] bytes) { @@ -102,6 +125,12 @@ public class NetconfXMLToHelloMessageDecoder extends NetconfXMLToMessageDecoder return -1; } + + private void logMessage(byte[] bytes) { + String s = Charsets.UTF_8.decode(ByteBuffer.wrap(bytes)).toString(); + LOG.debug("Parsing message \n{}", s); + } + private boolean startsWithAdditionalHeader(byte[] bytes) { for (byte[] possibleStart : POSSIBLE_STARTS) { int i = 0;