You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by el...@apache.org on 2014/09/11 19:51:23 UTC
git commit: Applied patch from DIRMINA-785
Repository: mina
Updated Branches:
refs/heads/2.0 f04184d9f -> d3f53778d
Applied patch from DIRMINA-785
Project: http://git-wip-us.apache.org/repos/asf/mina/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina/commit/d3f53778
Tree: http://git-wip-us.apache.org/repos/asf/mina/tree/d3f53778
Diff: http://git-wip-us.apache.org/repos/asf/mina/diff/d3f53778
Branch: refs/heads/2.0
Commit: d3f53778d6d79a2611c4492364e3d9992e1b4312
Parents: f04184d
Author: Emmanuel Lécharny <el...@symas.com>
Authored: Thu Sep 11 19:51:06 2014 +0200
Committer: Emmanuel Lécharny <el...@symas.com>
Committed: Thu Sep 11 19:51:06 2014 +0200
----------------------------------------------------------------------
.../core/filterchain/DefaultIoFilterChain.java | 25 ++++++++++++++++++++
.../apache/mina/core/filterchain/IoFilter.java | 4 ++++
.../mina/core/filterchain/IoFilterAdapter.java | 4 ++++
.../mina/core/filterchain/IoFilterChain.java | 16 +++++++++----
.../polling/AbstractPollingIoProcessor.java | 4 +++-
.../mina/core/service/AbstractIoConnector.java | 4 ++++
.../org/apache/mina/core/service/IoHandler.java | 5 ++++
.../mina/core/service/IoHandlerAdapter.java | 4 ++++
.../multiton/SingleSessionIoHandler.java | 4 +++-
.../multiton/SingleSessionIoHandlerAdapter.java | 4 ++++
.../SingleSessionIoHandlerDelegate.java | 9 +++++--
.../executor/ExecutorFilterRegressionTest.java | 4 ++++
12 files changed, 79 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java b/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
index 87fc8e1..2a5f329 100644
--- a/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
+++ b/mina-core/src/main/java/org/apache/mina/core/filterchain/DefaultIoFilterChain.java
@@ -599,6 +599,21 @@ public class DefaultIoFilterChain implements IoFilterChain {
}
}
+ public void fireInputClosed() {
+ Entry head = this.head;
+ callNextInputClosed(head, session);
+ }
+
+ private void callNextInputClosed(Entry entry, IoSession session) {
+ try {
+ IoFilter filter = entry.getFilter();
+ NextFilter nextFilter = entry.getNextFilter();
+ filter.inputClosed(nextFilter, session);
+ } catch (Throwable e) {
+ fireExceptionCaught(e);
+ }
+ }
+
public void fireFilterWrite(WriteRequest writeRequest) {
callPreviousFilterWrite(tail, session, writeRequest);
}
@@ -815,6 +830,11 @@ public class DefaultIoFilterChain implements IoFilterChain {
}
@Override
+ public void inputClosed(NextFilter nextFilter, IoSession session) throws Exception {
+ session.getHandler().inputClosed(session);
+ }
+
+ @Override
public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
AbstractIoSession s = (AbstractIoSession) session;
@@ -913,6 +933,11 @@ public class DefaultIoFilterChain implements IoFilterChain {
callNextExceptionCaught(nextEntry, session, cause);
}
+ public void inputClosed(IoSession session) {
+ Entry nextEntry = EntryImpl.this.nextEntry;
+ callNextInputClosed(nextEntry, session);
+ }
+
public void messageReceived(IoSession session, Object message) {
Entry nextEntry = EntryImpl.this.nextEntry;
callNextMessageReceived(nextEntry, session, message);
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java b/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java
index 28c5188..e04ec38 100644
--- a/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java
+++ b/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilter.java
@@ -172,6 +172,8 @@ public interface IoFilter {
*/
void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) throws Exception;
+ void inputClosed(NextFilter nextFilter, IoSession session) throws Exception;
+
/**
* Filters {@link IoHandler#messageReceived(IoSession,Object)}
* event.
@@ -223,6 +225,8 @@ public interface IoFilter {
*/
void exceptionCaught(IoSession session, Throwable cause);
+ void inputClosed(IoSession session);
+
/**
* Forwards <tt>messageReceived</tt> event to next filter.
*/
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java b/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java
index ab9a4ad..39c5508 100644
--- a/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java
+++ b/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterAdapter.java
@@ -130,6 +130,10 @@ public class IoFilterAdapter implements IoFilter {
nextFilter.filterClose(session);
}
+ public void inputClosed(NextFilter nextFilter, IoSession session) throws Exception {
+ nextFilter.inputClosed(session);
+ }
+
public String toString() {
return this.getClass().getSimpleName();
}
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterChain.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterChain.java b/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterChain.java
index 8e34bde..ab85eb5 100644
--- a/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterChain.java
+++ b/mina-core/src/main/java/org/apache/mina/core/filterchain/IoFilterChain.java
@@ -301,11 +301,19 @@ public interface IoFilterChain {
public void fireExceptionCaught(Throwable cause);
/**
- * Fires a {@link IoSession#write(Object)} event. Most users don't need to call this
- * method at all. Please use this method only when you implement a new transport or fire a
- * virtual event.
+ * Fires a {@link IoHandler#inputClosed(IoSession, Throwable)} event. Most
+ * users don't need to call this method at all. Please use this method only
+ * when you implement a new transport or fire a virtual event.
+ */
+ public void fireInputClosed();
+
+ /**
+ * Fires a {@link IoSession#write(Object)} event. Most users don't need to
+ * call this method at all. Please use this method only when you implement a
+ * new transport or fire a virtual event.
*
- * @param writeRequest The message to write
+ * @param writeRequest
+ * The message to write
*/
public void fireFilterWrite(WriteRequest writeRequest);
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java b/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
index bead516..65ef32a 100644
--- a/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
+++ b/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
@@ -720,7 +720,9 @@ public abstract class AbstractPollingIoProcessor<S extends AbstractIoSession> im
}
if (ret < 0) {
- scheduleRemove(session);
+ // scheduleRemove(session);
+ IoFilterChain filterChain = session.getFilterChain();
+ filterChain.fireInputClosed();
}
} catch (Exception e) {
if (e instanceof IOException) {
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java b/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java
index c67bc94..ffc11d5 100644
--- a/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java
+++ b/mina-core/src/main/java/org/apache/mina/core/service/AbstractIoConnector.java
@@ -257,6 +257,10 @@ public abstract class AbstractIoConnector extends AbstractIoService implements I
public void sessionOpened(IoSession session) throws Exception {
// Empty handler
}
+
+ public void inputClosed(IoSession session) throws Exception {
+ // Empty handler
+ }
});
} else {
throw new IllegalStateException("handler is not set.");
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/core/service/IoHandler.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/service/IoHandler.java b/mina-core/src/main/java/org/apache/mina/core/service/IoHandler.java
index 38bb6c4..4840a9e 100644
--- a/mina-core/src/main/java/org/apache/mina/core/service/IoHandler.java
+++ b/mina-core/src/main/java/org/apache/mina/core/service/IoHandler.java
@@ -78,4 +78,9 @@ public interface IoHandler {
* sent out.
*/
void messageSent(IoSession session, Object message) throws Exception;
+
+ /**
+ * Handle the closure of an half-duplex TCP channel
+ */
+ void inputClosed(IoSession session) throws Exception;
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java b/mina-core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java
index d659247..af92c33 100644
--- a/mina-core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java
+++ b/mina-core/src/main/java/org/apache/mina/core/service/IoHandlerAdapter.java
@@ -64,4 +64,8 @@ public class IoHandlerAdapter implements IoHandler {
public void messageSent(IoSession session, Object message) throws Exception {
// Empty handler
}
+
+ public void inputClosed(IoSession session) throws Exception {
+ session.close(true);
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandler.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandler.java b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandler.java
index 6db7645..f180133 100644
--- a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandler.java
+++ b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandler.java
@@ -38,7 +38,7 @@ import org.apache.mina.core.session.IoSession;
* conversational state as instance variables in this object.
* </p>
*
- * WARNING: This class is badly named as the actual {@link IoHandler} implementor
+ * WARNING: This class is badly named as the actual {@link IoHandler} implementor
* is in fact the {@link SingleSessionIoHandlerDelegate}.
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
@@ -90,6 +90,8 @@ public interface SingleSessionIoHandler {
*/
void exceptionCaught(Throwable cause) throws Exception;
+ void inputClosed(IoSession session);
+
/**
* Invoked when protocol message is received. Implement your protocol flow
* here.
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerAdapter.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerAdapter.java b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerAdapter.java
index 181f6f3..a7ce9e2 100644
--- a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerAdapter.java
+++ b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerAdapter.java
@@ -62,6 +62,10 @@ public class SingleSessionIoHandlerAdapter implements SingleSessionIoHandler {
// Do nothing
}
+ public void inputClosed(IoSession session) {
+ // Do nothing
+ }
+
public void messageReceived(Object message) throws Exception {
// Do nothing
}
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerDelegate.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerDelegate.java b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerDelegate.java
index 92f2e8b..f2bd86d 100644
--- a/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerDelegate.java
+++ b/mina-core/src/main/java/org/apache/mina/handler/multiton/SingleSessionIoHandlerDelegate.java
@@ -30,8 +30,8 @@ import org.apache.mina.core.session.IoSession;
* is used to create a new {@link SingleSessionIoHandler} for each newly
* created session.
*
- * WARNING : This {@link IoHandler} implementation may be easier to understand and
- * thus to use but the user should be aware that creating one handler by session
+ * WARNING : This {@link IoHandler} implementation may be easier to understand and
+ * thus to use but the user should be aware that creating one handler by session
* will lower scalability if building an high performance server. This should only
* be used with very specific needs in mind.
*
@@ -145,4 +145,9 @@ public class SingleSessionIoHandlerDelegate implements IoHandler {
SingleSessionIoHandler handler = (SingleSessionIoHandler) session.getAttribute(HANDLER);
handler.messageSent(message);
}
+
+ public void inputClosed(IoSession session) throws Exception {
+ SingleSessionIoHandler handler = (SingleSessionIoHandler) session.getAttribute(HANDLER);
+ handler.inputClosed(session);
+ }
}
http://git-wip-us.apache.org/repos/asf/mina/blob/d3f53778/mina-core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
----------------------------------------------------------------------
diff --git a/mina-core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java b/mina-core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
index 07b6b6a..2b8aeda 100644
--- a/mina-core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
+++ b/mina-core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java
@@ -134,6 +134,10 @@ public class ExecutorFilterRegressionTest {
// Do nothing
}
+ public void inputClosed(IoSession session) {
+ // Do nothing
+ }
+
public void messageReceived(IoSession session, Object message) {
try {
((EventOrderCounter) session).setLastCount((Integer) message);