package org.opendaylight.controller.netconf.impl.mapping.operations;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import java.util.Collections;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
-import org.opendaylight.controller.netconf.api.NetconfOperationRouter;
-import org.opendaylight.controller.netconf.api.NetconfSession;
-import org.opendaylight.controller.netconf.mapping.api.DefaultNetconfOperation;
-import org.opendaylight.controller.netconf.mapping.api.HandlingPriority;
-import org.opendaylight.controller.netconf.util.mapping.AbstractNetconfOperation;
+import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants;
+import org.opendaylight.controller.netconf.impl.NetconfServerSession;
+import org.opendaylight.controller.netconf.util.mapping.AbstractSingletonNetconfOperation;
import org.opendaylight.controller.netconf.util.xml.XmlElement;
-import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants;
+import org.opendaylight.controller.netconf.util.xml.XmlUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-public class DefaultCloseSession extends AbstractNetconfOperation implements DefaultNetconfOperation {
+public class DefaultCloseSession extends AbstractSingletonNetconfOperation implements DefaultNetconfOperation {
+ private static final Logger LOG = LoggerFactory.getLogger(DefaultCloseSession.class);
+
public static final String CLOSE_SESSION = "close-session";
- private NetconfSession netconfSession;
- public DefaultCloseSession(String netconfSessionIdForReporting) {
+ private final AutoCloseable sessionResources;
+ private NetconfServerSession session;
+
+ public DefaultCloseSession(String netconfSessionIdForReporting, AutoCloseable sessionResources) {
super(netconfSessionIdForReporting);
+ this.sessionResources = sessionResources;
}
@Override
- protected HandlingPriority canHandle(String operationName, String netconfOperationNamespace) {
- if (operationName.equals(CLOSE_SESSION) == false)
- return HandlingPriority.CANNOT_HANDLE;
- if (netconfOperationNamespace.equals(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0) == false)
- return HandlingPriority.CANNOT_HANDLE;
-
- return HandlingPriority.HANDLE_WITH_MAX_PRIORITY;
+ protected String getOperationName() {
+ return CLOSE_SESSION;
}
/**
* instances
*/
@Override
- protected Element handle(Document document, XmlElement operationElement, NetconfOperationRouter opRouter)
+ protected Element handleWithNoSubsequentOperations(Document document, XmlElement operationElement)
throws NetconfDocumentedException {
- opRouter.close();
- return document.createElement(XmlNetconfConstants.OK);
+ try {
+ sessionResources.close();
+ Preconditions.checkNotNull(session, "Session was not set").delayedClose();
+ LOG.info("Session {} closing", session.getSessionId());
+ } catch (Exception e) {
+ throw new NetconfDocumentedException("Unable to properly close session "
+ + getNetconfSessionIdForReporting(), NetconfDocumentedException.ErrorType.application,
+ NetconfDocumentedException.ErrorTag.operation_failed,
+ NetconfDocumentedException.ErrorSeverity.error, Collections.singletonMap(
+ NetconfDocumentedException.ErrorSeverity.error.toString(), e.getMessage()));
+ }
+ return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent());
}
@Override
- public void setNetconfSession(NetconfSession s) {
- this.netconfSession = s;
- }
-
- public NetconfSession getNetconfSession() {
- return netconfSession;
+ public void setNetconfSession(final NetconfServerSession s) {
+ this.session = s;
}
}