Remove isCloseMsg check for each rpc
[controller.git] / opendaylight / netconf / netconf-impl / src / main / java / org / opendaylight / controller / netconf / impl / mapping / operations / DefaultCloseSession.java
index 3623ef50325378b1c710d005248be520479c6763..303352c9c557f111cabde8866e4376698cb96190 100644 (file)
@@ -8,33 +8,36 @@
 
 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;
     }
 
     /**
@@ -43,18 +46,24 @@ public class DefaultCloseSession extends AbstractNetconfOperation implements Def
      * 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;
     }
 }