X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-client%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fclient%2FNetconfClientSessionNegotiator.java;h=17f5608a1c3d0bafffe134f289ffee809324b572;hp=cbbee1f65508353b117bbd21db22b523b4244694;hb=b2e81149739c87f0ecc2ce7f06448d7a5d3162b8;hpb=3c2b9f44d59d735907ef541d36542443221c5c68 diff --git a/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiator.java b/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiator.java index cbbee1f655..17f5608a1c 100644 --- a/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiator.java +++ b/opendaylight/netconf/netconf-client/src/main/java/org/opendaylight/controller/netconf/client/NetconfClientSessionNegotiator.java @@ -8,9 +8,8 @@ package org.opendaylight.controller.netconf.client; -import com.google.common.base.Preconditions; +import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; - import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; @@ -18,12 +17,10 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.util.Timer; import io.netty.util.concurrent.Promise; - import java.util.Collection; - import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; - +import org.opendaylight.controller.config.util.xml.XmlUtil; import org.opendaylight.controller.netconf.api.NetconfClientSessionPreferences; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; @@ -34,7 +31,6 @@ import org.opendaylight.controller.netconf.nettyutil.handler.exi.NetconfStartExi import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage; import org.opendaylight.controller.netconf.util.messages.NetconfMessageUtil; import org.opendaylight.controller.netconf.util.xml.XMLNetconfUtil; -import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -44,11 +40,14 @@ import org.w3c.dom.NodeList; public class NetconfClientSessionNegotiator extends AbstractNetconfSessionNegotiator { - private static final Logger logger = LoggerFactory.getLogger(NetconfClientSessionNegotiator.class); + private static final Logger LOG = LoggerFactory.getLogger(NetconfClientSessionNegotiator.class); private static final XPathExpression sessionIdXPath = XMLNetconfUtil .compileXPath("/netconf:hello/netconf:session-id"); + private static final XPathExpression sessionIdXPathNoNamespace = XMLNetconfUtil + .compileXPath("/hello/session-id"); + private static final String EXI_1_0_CAPABILITY_MARKER = "exi:1.0"; protected NetconfClientSessionNegotiator(final NetconfClientSessionPreferences sessionPreferences, @@ -68,12 +67,12 @@ public class NetconfClientSessionNegotiator extends // If exi should be used, try to initiate exi communication // Call negotiationSuccessFul after exi negotiation is finished successfully or not if (shouldUseExi(netconfMessage)) { - logger.debug("Netconf session {} should use exi.", session); + LOG.debug("Netconf session {} should use exi.", session); NetconfStartExiMessage startExiMessage = (NetconfStartExiMessage) sessionPreferences.getStartExiMessage(); tryToInitiateExi(session, startExiMessage); } else { // Exi is not supported, release session immediately - logger.debug("Netconf session {} isn't capable of using exi.", session); + LOG.debug("Netconf session {} isn't capable of using exi.", session); negotiationSuccessful(session); } } @@ -92,10 +91,10 @@ public class NetconfClientSessionNegotiator extends @Override public void operationComplete(final ChannelFuture f) { if (!f.isSuccess()) { - logger.warn("Failed to send start-exi message {} on session {}", startExiMessage, this, f.cause()); + LOG.warn("Failed to send start-exi message {} on session {}", startExiMessage, this, f.cause()); channel.pipeline().remove(ExiConfirmationInboundHandler.EXI_CONFIRMED_HANDLER); } else { - logger.trace("Start-exi message {} sent to socket on session {}", startExiMessage, this); + LOG.trace("Start-exi message {} sent to socket on session {}", startExiMessage, this); } } }); @@ -106,7 +105,7 @@ public class NetconfClientSessionNegotiator extends && containsExi10Capability(sessionPreferences.getHelloMessage().getDocument()); } - private boolean containsExi10Capability(final Document doc) { + private static boolean containsExi10Capability(final Document doc) { final NodeList nList = doc.getElementsByTagName(XmlNetconfConstants.CAPABILITY); for (int i = 0; i < nList.getLength(); i++) { if (nList.item(i).getTextContent().contains(EXI_1_0_CAPABILITY_MARKER)) { @@ -116,17 +115,23 @@ public class NetconfClientSessionNegotiator extends return false; } - private long extractSessionId(final Document doc) { - final Node sessionIdNode = (Node) XmlUtil.evaluateXPath(sessionIdXPath, doc, XPathConstants.NODE); - Preconditions.checkState(sessionIdNode != null, ""); - String textContent = sessionIdNode.getTextContent(); - if (textContent == null || textContent.equals("")) { - throw new IllegalStateException("Session id not received from server"); + private static long extractSessionId(final Document doc) { + String textContent = getSessionIdWithXPath(doc, sessionIdXPath); + if (Strings.isNullOrEmpty(textContent)) { + textContent = getSessionIdWithXPath(doc, sessionIdXPathNoNamespace); + if (Strings.isNullOrEmpty(textContent)) { + throw new IllegalStateException("Session id not received from server, hello message: " + XmlUtil.toString(doc)); + } } return Long.valueOf(textContent); } + private static String getSessionIdWithXPath(final Document doc, final XPathExpression sessionIdXPath) { + final Node sessionIdNode = (Node) XmlUtil.evaluateXPath(sessionIdXPath, doc, XPathConstants.NODE); + return sessionIdNode != null ? sessionIdNode.getTextContent() : null; + } + @Override protected NetconfClientSession getSession(final NetconfClientSessionListener sessionListener, final Channel channel, final NetconfHelloMessage message) throws NetconfDocumentedException { @@ -161,26 +166,25 @@ public class NetconfClientSessionNegotiator extends // Ok response to start-exi, try to add exi handlers if (NetconfMessageUtil.isOKMessage(netconfMessage)) { - logger.trace("Positive response on start-exi call received on session {}", session); + LOG.trace("Positive response on start-exi call received on session {}", session); try { session.startExiCommunication(startExiMessage); } catch (RuntimeException e) { // Unable to add exi, continue without exi - logger.warn("Unable to start exi communication, Communication will continue without exi on session {}", session, e); + LOG.warn("Unable to start exi communication, Communication will continue without exi on session {}", session, e); } // Error response } else if(NetconfMessageUtil.isErrorMessage(netconfMessage)) { - logger.warn( + LOG.warn( "Error response to start-exi message {}, Communication will continue without exi on session {}", - XmlUtil.toString(netconfMessage.getDocument()), session); + netconfMessage, session); // Unexpected response to start-exi, throwing message away, continue without exi } else { - logger.warn( - "Unexpected response to start-exi message, should be ok, was {}, " + - "Communication will continue without exi and response message will be thrown away on session {}", - XmlUtil.toString(netconfMessage.getDocument()), session); + LOG.warn("Unexpected response to start-exi message, should be ok, was {}, " + + "Communication will continue without exi and response message will be thrown away on session {}", + netconfMessage, session); } negotiationSuccessful(session);