Author: jvermillard
Date: Wed Nov 30 21:29:20 2011
New Revision: 1208802

URL: http://svn.apache.org/viewvc?rev=1208802&view=rev
Log:
sesion closing (WIP)

Added:
    mina/trunk/core/src/main/java/org/apache/mina/api/RuntimeIoException.java   
(with props)
Modified:
    
mina/trunk/core/src/main/java/org/apache/mina/api/ConfigurationException.java
    mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java
    mina/trunk/core/src/main/java/org/apache/mina/service/SelectorProcessor.java
    mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
    mina/trunk/core/src/main/java/org/apache/mina/session/WriteRequest.java
    
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
    
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java
    
mina/trunk/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/api/ConfigurationException.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/api/ConfigurationException.java?rev=1208802&r1=1208801&r2=1208802&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/api/ConfigurationException.java 
(original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/api/ConfigurationException.java 
Wed Nov 30 21:29:20 2011
@@ -25,6 +25,8 @@ package org.apache.mina.api;
  */
 public class ConfigurationException extends RuntimeException {
 
+    private static final long serialVersionUID = 1L;
+
     public ConfigurationException() {
         super();
     }

Modified: mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java?rev=1208802&r1=1208801&r2=1208802&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/api/IoSession.java Wed Nov 30 
21:29:20 2011
@@ -82,6 +82,7 @@ public interface IoSession {
     IoService getService();
 
     /* READ / WRITE / CLOSE */
+
     /**
      * Tells if the session is currently connected and able to process 
incoming requests and to send outgoing responses.
      * 
@@ -90,12 +91,11 @@ public interface IoSession {
     boolean isConnected();
 
     /**
-     * Tells if the session is being closed, but is not yet in Closed state.
+     * Tells if the session is currently closed.
      * 
-     * @return <code>true</tt> if and only if this session is being closed
-     * (but not disconnected yet) or is closed.
+     * @return <code>true</code> if this session is disconnected with remote 
peer.
      */
-    boolean isClosing();
+    boolean isClosed();
 
     /**
      * Tells if the session is processing a SSL/TLS handshake.

Added: mina/trunk/core/src/main/java/org/apache/mina/api/RuntimeIoException.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/api/RuntimeIoException.java?rev=1208802&view=auto
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/api/RuntimeIoException.java 
(added)
+++ mina/trunk/core/src/main/java/org/apache/mina/api/RuntimeIoException.java 
Wed Nov 30 21:29:20 2011
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.mina.api;
+
+/**
+ *  A {@link RuntimeException} thrown when something wrong happened during 
{@link IoService} or {@link IoSession} I/O processing.
+ *
+ * @author <a href="http://mina.apache.org";>Apache MINA Project</a>
+ */
+public class RuntimeIoException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+
+    public RuntimeIoException() {
+        super();
+    }
+
+    public RuntimeIoException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public RuntimeIoException(String message) {
+        super(message);
+    }
+
+    public RuntimeIoException(Throwable cause) {
+        super(cause);
+    }
+
+}

Propchange: 
mina/trunk/core/src/main/java/org/apache/mina/api/RuntimeIoException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/service/SelectorProcessor.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/service/SelectorProcessor.java?rev=1208802&r1=1208801&r2=1208802&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/service/SelectorProcessor.java 
(original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/service/SelectorProcessor.java 
Wed Nov 30 21:29:20 2011
@@ -61,4 +61,5 @@ public interface SelectorProcessor {
      * @param session the session to flush
      */
     void flush(IoSession session);
+
 }

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java?rev=1208802&r1=1208801&r2=1208802&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java 
(original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/session/AbstractIoSession.java 
Wed Nov 30 21:29:20 2011
@@ -54,7 +54,7 @@ public abstract class AbstractIoSession 
     private final IoService service;
 
     /** The {@link SelectorProcessor} used for handling this session writing */
-    private SelectorProcessor writeProcessor;
+    protected SelectorProcessor writeProcessor;
 
     /** The number of bytes read since this session has been created */
     private volatile long readBytes;

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/session/WriteRequest.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/session/WriteRequest.java?rev=1208802&r1=1208801&r2=1208802&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/session/WriteRequest.java 
(original)
+++ mina/trunk/core/src/main/java/org/apache/mina/session/WriteRequest.java Wed 
Nov 30 21:29:20 2011
@@ -41,4 +41,5 @@ public interface WriteRequest {
      * @return the future
      */
     IoFuture<Void> getFuture();
+
 }
\ No newline at end of file

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java?rev=1208802&r1=1208801&r2=1208802&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
 Wed Nov 30 21:29:20 2011
@@ -252,18 +252,6 @@ public class NioSelectorProcessor implem
         wakeupWorker();
     }
 
-    /** 
-     * {@inheritDoc}
-     */
-    @Override
-    public void scheduleForClose(IoSession session) {
-        LOGGER.debug("scheduling session {} for close", session);
-        // add the session in the list of session for close.
-        sessionsToClose.add((NioTcpSession) session);
-        // wake the selector for unlocking the I/O thread
-        wakeupWorker();
-    }
-
     /**
      * The worker processing incoming session creation, session destruction 
requests, session write and reads.
      * It will also bind new servers.

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java?rev=1208802&r1=1208801&r2=1208802&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java 
(original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java 
Wed Nov 30 21:29:20 2011
@@ -19,34 +19,65 @@
  */
 package org.apache.mina.transport.tcp;
 
+import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.nio.channels.SocketChannel;
 
 import org.apache.mina.api.IoFuture;
+import org.apache.mina.api.RuntimeIoException;
 import org.apache.mina.service.SelectorProcessor;
 import org.apache.mina.session.AbstractIoSession;
+import org.apache.mina.transport.tcp.nio.NioTcpClient;
 import org.apache.mina.transport.tcp.nio.NioTcpServer;
+import org.apache.mina.util.AbstractIoFuture;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
- * 
+ * A NIO based TCP session, should be used by {@link NioTcpServer} and {@link 
NioTcpClient}.
+ * A TCP session is a connection between a our server/client and the remote 
end-point.
  * 
  * @author <a href="http://mina.apache.org";>Apache MINA Project</a>
  *
  */
 public class NioTcpSession extends AbstractIoSession {
 
+    private static final Logger LOG = 
LoggerFactory.getLogger(NioTcpSession.class);
+
+    /** the NIO socket channel for this TCP session */
     private SocketChannel channel;
 
+    /** the socket configuration */
     private final SocketSessionConfig configuration;
 
+    // this session requested to close
+    private volatile boolean closeRequested = false;
+
+    /** we pre-allocate a close future for lock-less {@link #close(boolean)} */
+    private final IoFuture<Void> closeFuture = new AbstractIoFuture<Void>() {
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected boolean cancelOwner(boolean mayInterruptIfRunning) {
+            // we don't cancel close
+            return false;
+        }
+    };
+
     NioTcpSession(NioTcpServer service, SocketChannel channel, 
SelectorProcessor writeProcessor) {
         super(service, writeProcessor);
         this.channel = channel;
         this.configuration = new ProxySocketSessionConfig(channel.socket());
     }
 
-    public SocketChannel getSocketChannel() {
+    /**
+     * Get the underlying {@link SocketChannel} of this session
+     * @return the socket channel used by this session
+     */
+    SocketChannel getSocketChannel() {
         return channel;
     }
 
@@ -90,10 +121,9 @@ public class NioTcpSession extends Abstr
      */
     @Override
     public boolean isConnected() {
-        // TODO Auto-generated method stub
-        return false;
+        return state == SessionState.CONNECTED;
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -101,7 +131,7 @@ public class NioTcpSession extends Abstr
     public boolean isSecuring() {
         return state == SessionState.SECURING;
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -114,9 +144,8 @@ public class NioTcpSession extends Abstr
      * {@inheritDoc}
      */
     @Override
-    public boolean isClosing() {
-        // TODO Auto-generated method stub
-        return false;
+    public boolean isClosed() {
+        return state == SessionState.CLOSED;
     }
 
     /**
@@ -124,8 +153,36 @@ public class NioTcpSession extends Abstr
      */
     @Override
     public IoFuture<Void> close(boolean immediately) {
-        // TODO Auto-generated method stub
-        return null;
+        switch (state) {
+        case CREATED:
+            LOG.error("Session {} not opened", this);
+            throw new RuntimeIoException("cannot close an not opened session");
+        case CONNECTED:
+            closeRequested = true;
+            state = SessionState.CLOSING;
+            if (immediately) {
+                try {
+                    channel.close();
+                } catch (IOException e) {
+                    throw new RuntimeIoException(e);
+                }
+            } else {
+                // flush this session the flushing code will close the session
+                writeProcessor.flush(this);
+            }
+            break;
+        case CLOSING:
+            // return the same future
+            LOG.warn("Already closing session {}", this);
+            break;
+        case CLOSED:
+            LOG.warn("Already closed session {}", this);
+            break;
+        default:
+            throw new RuntimeIoException("not implemented session state : " + 
state);
+        }
+
+        return closeFuture;
     }
 
     /**
@@ -133,8 +190,8 @@ public class NioTcpSession extends Abstr
      */
     @Override
     public void suspendRead() {
-        // TODO Auto-generated method stub
-
+        // TODO
+        throw new RuntimeException("Not implemented");
     }
 
     /**
@@ -142,8 +199,8 @@ public class NioTcpSession extends Abstr
      */
     @Override
     public void suspendWrite() {
-        // TODO Auto-generated method stub
-
+        // TODO
+        throw new RuntimeException("Not implemented");
     }
 
     /**
@@ -151,8 +208,8 @@ public class NioTcpSession extends Abstr
      */
     @Override
     public void resumeRead() {
-        // TODO Auto-generated method stub
-
+        // TODO
+        throw new RuntimeException("Not implemented");
     }
 
     /**
@@ -160,7 +217,8 @@ public class NioTcpSession extends Abstr
      */
     @Override
     public void resumeWrite() {
-        // TODO Auto-generated method stub
+        // TODO
+        throw new RuntimeException("Not implemented");
     }
 
     /**
@@ -168,8 +226,8 @@ public class NioTcpSession extends Abstr
      */
     @Override
     public boolean isReadSuspended() {
-        // TODO Auto-generated method stub
-        return false;
+        // TODO
+        throw new RuntimeException("Not implemented");
     }
 
     /**
@@ -177,8 +235,8 @@ public class NioTcpSession extends Abstr
      */
     @Override
     public boolean isWriteSuspended() {
-        // TODO Auto-generated method stub
-        return false;
+        // TODO
+        throw new RuntimeException("Not implemented");
     }
 
     /**
@@ -189,10 +247,13 @@ public class NioTcpSession extends Abstr
         return configuration;
     }
 
+    /**
+     * Set this session status as connected. To be called by the processor 
selecting/polling this session.
+     */
     void setConnected() {
         if (getState() != SessionState.CREATED) {
             throw new RuntimeException("Trying to open a non created session");
         }
         state = SessionState.CONNECTED;
     }
-}
\ No newline at end of file
+}

Modified: 
mina/trunk/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java?rev=1208802&r1=1208801&r2=1208802&view=diff
==============================================================================
--- 
mina/trunk/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
 (original)
+++ 
mina/trunk/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
 Wed Nov 30 21:29:20 2011
@@ -59,11 +59,6 @@ public class AbstractIoSessionTest {
         }
 
         @Override
-        public boolean isClosing() {
-            return false;
-        }
-
-        @Override
         public boolean isConnected() {
             return false;
         }
@@ -95,14 +90,18 @@ public class AbstractIoSessionTest {
         }
 
         @Override
-        public boolean isSecuring()
-        {
+        public boolean isSecuring() {
+            return false;
+        }
+
+        @Override
+        public boolean isSecured() {
             return false;
         }
 
         @Override
-        public boolean isSecured()
-        {
+        public boolean isClosed() {
+            // TODO Auto-generated method stub
             return false;
         }
     }


Reply via email to