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%2FAbstractNetconfSessionNegotiator.java;h=5521e28818b20fcb9291089ced8867cce787e2e6;hp=7f2d8c30f045fb6830458aa7fd461cc7885e8349;hb=84248dac9ed8aa37e996e39429c8aa8ece473eaf;hpb=13a76258537f64367e3036925a0331522a571705 diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/AbstractNetconfSessionNegotiator.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/AbstractNetconfSessionNegotiator.java index 7f2d8c30f0..5521e28818 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/AbstractNetconfSessionNegotiator.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/AbstractNetconfSessionNegotiator.java @@ -8,9 +8,12 @@ package org.opendaylight.controller.netconf.util; +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.ssl.SslHandler; import io.netty.util.Timeout; import io.netty.util.Timer; @@ -18,11 +21,7 @@ import io.netty.util.TimerTask; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; import io.netty.util.concurrent.Promise; - -import java.util.concurrent.TimeUnit; - -import io.netty.channel.ChannelInboundHandlerAdapter; -import org.opendaylight.controller.netconf.api.AbstractNetconfSession; +import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.api.NetconfSessionListener; import org.opendaylight.controller.netconf.api.NetconfSessionPreferences; @@ -39,16 +38,16 @@ import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; +import java.util.concurrent.TimeUnit; public abstract class AbstractNetconfSessionNegotiator

, L extends NetconfSessionListener> extends AbstractSessionNegotiator { private static final Logger logger = LoggerFactory.getLogger(AbstractNetconfSessionNegotiator.class); + public static final String NAME_OF_EXCEPTION_HANDLER = "lastExceptionHandler"; - private final P sessionPreferences; + protected final P sessionPreferences; private final L sessionListener; private Timeout timeout; @@ -56,7 +55,7 @@ extends AbstractSessionNegotiator { /** * Possible states for Finite State Machine */ - private enum State { + protected enum State { IDLE, OPEN_WAIT, FAILED, ESTABLISHED } @@ -64,6 +63,7 @@ extends AbstractSessionNegotiator { private final Timer timer; private final long connectionTimeoutMillis; + // TODO shrink constructor protected AbstractNetconfSessionNegotiator(P sessionPreferences, Promise promise, Channel channel, Timer timer, L sessionListener, long connectionTimeoutMillis) { super(promise, channel); @@ -123,23 +123,24 @@ extends AbstractSessionNegotiator { } }, connectionTimeoutMillis, TimeUnit.MILLISECONDS); - sendMessage(helloMessage); + // FIXME, make sessionPreferences return HelloMessage, move NetconfHelloMessage to API + sendMessage((NetconfHelloMessage)helloMessage); changeState(State.OPEN_WAIT); } - private void cancelTimeout() { if(timeout!=null) { timeout.cancel(); } } - private void sendMessage(NetconfMessage message) { - this.channel.writeAndFlush(message); + @Override + protected void handleMessage(NetconfHelloMessage netconfMessage) throws NetconfDocumentedException { + S session = getSessionForHelloMessage(netconfMessage) ; + negotiationSuccessful(session); } - @Override - protected void handleMessage(NetconfHelloMessage netconfMessage) { - Preconditions.checkNotNull(netconfMessage != null, "netconfMessage"); + protected final S getSessionForHelloMessage(NetconfHelloMessage netconfMessage) throws NetconfDocumentedException { + Preconditions.checkNotNull(netconfMessage, "netconfMessage"); final Document doc = netconfMessage.getDocument(); @@ -150,22 +151,20 @@ extends AbstractSessionNegotiator { } changeState(State.ESTABLISHED); - S session = getSession(sessionListener, channel, netconfMessage); - - negotiationSuccessful(session); + return getSession(sessionListener, channel, netconfMessage); } /** * Insert chunk framing handlers into the pipeline */ - private void insertChunkFramingToPipeline() { + protected void insertChunkFramingToPipeline() { replaceChannelHandler(channel, AbstractChannelInitializer.NETCONF_MESSAGE_FRAME_ENCODER, FramingMechanismHandlerFactory.createHandler(FramingMechanism.CHUNK)); replaceChannelHandler(channel, AbstractChannelInitializer.NETCONF_MESSAGE_AGGREGATOR, new NetconfChunkAggregator()); } - private boolean shouldUseChunkFraming(Document doc) { + protected boolean shouldUseChunkFraming(Document doc) { return containsBase11Capability(doc) && containsBase11Capability(sessionPreferences.getHelloMessage().getDocument()); } @@ -173,7 +172,7 @@ extends AbstractSessionNegotiator { /** * Remove special handlers for hello message. Insert regular netconf xml message (en|de)coders. */ - private void replaceHelloMessageHandlers() { + protected void replaceHelloMessageHandlers() { replaceChannelHandler(channel, AbstractChannelInitializer.NETCONF_MESSAGE_DECODER, new NetconfXMLToMessageDecoder()); replaceChannelHandler(channel, AbstractChannelInitializer.NETCONF_MESSAGE_ENCODER, new NetconfMessageToXMLEncoder()); } @@ -182,9 +181,9 @@ extends AbstractSessionNegotiator { return channel.pipeline().replace(handlerKey, handlerKey, decoder); } - protected abstract S getSession(L sessionListener, Channel channel, NetconfHelloMessage message); + protected abstract S getSession(L sessionListener, Channel channel, NetconfHelloMessage message) throws NetconfDocumentedException; - private synchronized void changeState(final State newState) { + protected synchronized void changeState(final State newState) { logger.debug("Changing state from : {} to : {}", state, newState); Preconditions.checkState(isStateChangePermitted(state, newState), "Cannot change state from %s to %s", state, newState); @@ -211,7 +210,6 @@ extends AbstractSessionNegotiator { if (state == State.OPEN_WAIT && newState == State.FAILED) { return true; } - logger.debug("Transition from {} to {} is not allowed", state, newState); return false; } @@ -220,7 +218,6 @@ extends AbstractSessionNegotiator { * Handler to catch exceptions in pipeline during negotiation */ private final class ExceptionHandlingInboundChannelHandler extends ChannelInboundHandlerAdapter { - @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { logger.warn("An exception occurred during negotiation on channel {}", channel.localAddress(), cause);