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%2Fmessages%2FNetconfMessageFactory.java;h=891d40cf74fa520be681aa73109765424f5ab8e8;hp=ca3079bb16ce0a6ce2a3156064b275f0d0d23a80;hb=6da86863382c6c850fb2f7c7d2e026d0aa96ae1a;hpb=a92d9d6a21a0f6ca8d2153795721f500eaf29ee9 diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfMessageFactory.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfMessageFactory.java index ca3079bb16..891d40cf74 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfMessageFactory.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/messages/NetconfMessageFactory.java @@ -11,9 +11,6 @@ package org.opendaylight.controller.netconf.util.messages; import com.google.common.base.Charsets; import com.google.common.base.Optional; import com.google.common.collect.Lists; -import io.netty.buffer.Unpooled; -import io.netty.channel.ChannelHandler; -import io.netty.handler.codec.DelimiterBasedFrameDecoder; import org.opendaylight.controller.netconf.api.NetconfDeserializerException; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.util.xml.XmlUtil; @@ -40,14 +37,6 @@ public final class NetconfMessageFactory implements ProtocolMessageFactory clientId; public NetconfMessageFactory() { @@ -58,30 +47,65 @@ public final class NetconfMessageFactory implements ProtocolMessageFactory parse(byte[] bytes) throws DeserializerException, DocumentedException { - String s = Charsets.UTF_8.decode(ByteBuffer.wrap(bytes)).toString(); - logger.debug("Parsing message \n{}", s); - if (bytes[0] == '[') { - // yuma sends auth information in the first line. Ignore until ]\n - // is found. - int endOfAuthHeader = ByteArray.findByteSequence(bytes, new byte[] { ']', '\n' }); + public NetconfMessage parse(byte[] bytes) throws DeserializerException, DocumentedException { + logMessage(bytes); + + 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); } } - List messages = Lists.newArrayList(); + NetconfMessage message; try { Document doc = XmlUtil.readXmlToDocument(new ByteArrayInputStream(bytes)); - messages.add(new NetconfMessage(doc)); + message = new NetconfMessage(doc, additionalHeader); } catch (final SAXException | IOException | IllegalStateException e) { throw new NetconfDeserializerException("Could not parse message from " + new String(bytes), e); } - return messages; + return message; + } + + private int getAdditionalHeaderEndIndex(byte[] bytes) { + for (String possibleEnd : Lists.newArrayList("]\n", "]\r\n")) { + int idx = ByteArray.findByteSequence(bytes, possibleEnd.getBytes(Charsets.UTF_8)); + + if (idx != -1) { + return idx; + } + } + + return -1; + } + + private boolean startsWithAdditionalHeader(byte[] bytes) { + List possibleStarts = Lists.newArrayList("[", "\r\n[", "\n["); + for (String possibleStart : possibleStarts) { + int i = 0; + for (byte b : possibleStart.getBytes(Charsets.UTF_8)) { + if(bytes[i]!=b) + break; + + return true; + } + } + + return false; + }; + + private void logMessage(byte[] bytes) { + String s = Charsets.UTF_8.decode(ByteBuffer.wrap(bytes)).toString(); + logger.debug("Parsing message \n{}", s); + } + + private String additionalHeaderToString(byte[] bytes) { + return Charsets.UTF_8.decode(ByteBuffer.wrap(bytes)).toString(); } @Override @@ -90,52 +114,16 @@ public final class NetconfMessageFactory implements ProtocolMessageFactory MAX_CHUNK_SIZE) - logger.warn("Netconf message too long, should be split."); - h.setLength(msgBytes.limit()); - final byte[] headerBytes = h.toBytes(); - final ByteBuffer result = ByteBuffer.allocate(headerBytes.length + msgBytes.limit() + endOfChunk.length); - result.put(headerBytes); - result.put(msgBytes); - result.put(endOfChunk); - return result.array(); + byte[] b = new byte[msgBytes.limit()]; + msgBytes.get(b); + return b; } private String xmlToString(Document doc) { return XmlUtil.toString(doc, false); } - - /** - * For Hello message the framing is always EOM, but the framing mechanism - * may change. - * - * @param fm - * new framing mechanism - */ - public void setFramingMechanism(final FramingMechanism fm) { - logger.debug("Framing mechanism changed to {}", fm); - this.framing = fm; - } }