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;
}
}