X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fimpl%2FNetconfServerSession.java;h=6b306bc1907dda1f221630234ea5f01c95c0c9af;hb=23fe9ca678ada6263fec5dd996f4025e4a32fcf5;hp=280375d918fc487f98b29777a276fbdef9123cec;hpb=860206dfce8edb0fe74be842d2101f0eac7db2bd;p=controller.git diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSession.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSession.java index 280375d918..6b306bc190 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSession.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSession.java @@ -8,18 +8,21 @@ package org.opendaylight.controller.netconf.impl; +import com.google.common.base.Preconditions; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; +import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.MessageToByteEncoder; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; - +import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.api.monitoring.NetconfManagementSession; -import org.opendaylight.controller.netconf.util.AbstractNetconfSession; -import org.opendaylight.controller.netconf.util.handler.NetconfEXICodec; -import org.opendaylight.controller.netconf.util.handler.NetconfEXIToMessageDecoder; -import org.opendaylight.controller.netconf.util.handler.NetconfMessageToEXIEncoder; -import org.opendaylight.controller.netconf.util.handler.NetconfMessageToXMLEncoder; -import org.opendaylight.controller.netconf.util.handler.NetconfXMLToMessageDecoder; +import org.opendaylight.controller.netconf.nettyutil.AbstractNetconfSession; +import org.opendaylight.controller.netconf.nettyutil.handler.NetconfMessageToXMLEncoder; +import org.opendaylight.controller.netconf.nettyutil.handler.NetconfXMLToMessageDecoder; import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessageAdditionalHeader; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.DomainName; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Host; @@ -36,30 +39,51 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types. import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import io.netty.channel.Channel; - public final class NetconfServerSession extends AbstractNetconfSession implements NetconfManagementSession { - private static final Logger logger = LoggerFactory.getLogger(NetconfServerSession.class); + private static final Logger LOG = LoggerFactory.getLogger(NetconfServerSession.class); private final NetconfHelloMessageAdditionalHeader header; private Date loginTime; private long inRpcSuccess, inRpcFail, outRpcError; + private volatile boolean delayedClose; - public NetconfServerSession(NetconfServerSessionListener sessionListener, Channel channel, long sessionId, - NetconfHelloMessageAdditionalHeader header) { + public NetconfServerSession(final NetconfServerSessionListener sessionListener, final Channel channel, final long sessionId, + final NetconfHelloMessageAdditionalHeader header) { super(sessionListener, channel, sessionId); this.header = header; - logger.debug("Session {} created", toString()); + LOG.debug("Session {} created", toString()); } @Override protected void sessionUp() { - super.sessionUp(); Preconditions.checkState(loginTime == null, "Session is already up"); this.loginTime = new Date(); + super.sessionUp(); + } + + /** + * Close this session after next message is sent. + * Suitable for close rpc that needs to send ok response before the session is closed. + */ + public void delayedClose() { + this.delayedClose = true; + } + + @Override + public ChannelFuture sendMessage(final NetconfMessage netconfMessage) { + final ChannelFuture channelFuture = super.sendMessage(netconfMessage); + // delayed close was set, close after the message was sent + if(delayedClose) { + channelFuture.addListener(new ChannelFutureListener() { + @Override + public void operationComplete(final ChannelFuture future) throws Exception { + close(); + } + }); + } + return channelFuture; } public void onIncommingRpcSuccess() { @@ -111,15 +135,19 @@ public final class NetconfServerSession extends AbstractNetconfSession getTransportForString(String transport) { + private static Class getTransportForString(final String transport) { switch(transport) { - case "ssh" : return NetconfSsh.class; - case "tcp" : return NetconfTcp.class; - default: throw new IllegalArgumentException("Unknown transport type " + transport); + case "ssh" : + return NetconfSsh.class; + case "tcp" : + return NetconfTcp.class; + default: + throw new IllegalArgumentException("Unknown transport type " + transport); } } - private String formatDateTime(Date loginTime) { + private static String formatDateTime(final Date loginTime) { + // FIXME: thread-local cache? SimpleDateFormat dateFormat = new SimpleDateFormat(ISO_DATE_FORMAT); return dateFormat.format(loginTime); } @@ -130,9 +158,9 @@ public final class NetconfServerSession extends AbstractNetconfSession encoder) { + replaceMessageDecoder(decoder); + replaceMessageEncoderAfterNextMessage(encoder); } @Override