Modified: mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/stream/AbstractStreamWriteFilter.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/stream/AbstractStreamWriteFilter.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/stream/AbstractStreamWriteFilter.java (original) +++ mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/stream/AbstractStreamWriteFilter.java Sat Nov 8 16:05:27 2008 @@ -23,8 +23,8 @@ import java.util.Queue; import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.filterchain.IoFilter; import org.apache.mina.core.filterchain.IoFilterAdapter; -import org.apache.mina.core.filterchain.IoFilterChain; import org.apache.mina.core.session.AttributeKey; import org.apache.mina.core.session.IoSession; import org.apache.mina.core.write.DefaultWriteRequest; @@ -55,17 +55,17 @@ @Override - public void onPreAdd(IoFilterChain parent, String name, - NextFilter nextFilter) throws Exception { + public void onPreAdd(IoSession session, int index, String name, + IoFilter nextFilter) throws Exception { Class<? extends IoFilterAdapter> clazz = getClass(); - if (parent.contains(clazz)) { + if (session.getFilterChain().contains(clazz)) { throw new IllegalStateException( "Only one " + clazz.getName() + " is permitted."); } } @Override - public void filterWrite(NextFilter nextFilter, IoSession session, + public void filterWrite(int index, IoSession session, WriteRequest writeRequest) throws Exception { // If we're already processing a stream we need to queue the WriteRequest. if (session.getAttribute(CURRENT_STREAM) != null) { @@ -88,17 +88,17 @@ if (buffer == null) { // End of stream reached. writeRequest.getFuture().setWritten(); - nextFilter.messageSent(session, writeRequest); + session.getFilter(index).messageSent(index+1, session, writeRequest); } else { session.setAttribute(CURRENT_STREAM, message); session.setAttribute(CURRENT_WRITE_REQUEST, writeRequest); - nextFilter.filterWrite(session, new DefaultWriteRequest( - buffer)); + session.getFilter(index).filterWrite(index+1, session, + new DefaultWriteRequest(buffer)); } } else { - nextFilter.filterWrite(session, writeRequest); + session.getFilter(index).filterWrite(index+1, session, writeRequest); } } @@ -115,12 +115,12 @@ } @Override - public void messageSent(NextFilter nextFilter, IoSession session, + public void messageSent(int index, IoSession session, WriteRequest writeRequest) throws Exception { T stream = getMessageClass().cast(session.getAttribute(CURRENT_STREAM)); if (stream == null) { - nextFilter.messageSent(session, writeRequest); + session.getFilter(index).messageSent(index+1, session, writeRequest); } else { IoBuffer buffer = getNextBuffer(stream); @@ -135,16 +135,17 @@ if (queue != null) { WriteRequest wr = queue.poll(); while (wr != null) { - filterWrite(nextFilter, session, wr); + filterWrite(index+1, session, wr); wr = queue.poll(); } } currentWriteRequest.getFuture().setWritten(); - nextFilter.messageSent(session, currentWriteRequest); + session.getFilter(index).messageSent(index+1, session, + currentWriteRequest); } else { - nextFilter.filterWrite(session, new DefaultWriteRequest( - buffer)); + session.getFilter(index).filterWrite(index+1, session, + new DefaultWriteRequest(buffer)); } } }
Modified: mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java (original) +++ mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/CommonEventFilter.java Sat Nov 8 16:05:27 2008 @@ -77,7 +77,7 @@ @Override public final void filterWrite(int index, IoSession session, WriteRequest writeRequest) throws Exception { - filter(new IoFilterEvent(index+1, IoEventType.WRITE, session, writeRequest)); + filter(new IoFilterEvent(index, IoEventType.WRITE, session, writeRequest)); } @Override Modified: mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/ReferenceCountingFilter.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/ReferenceCountingFilter.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/ReferenceCountingFilter.java (original) +++ mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/ReferenceCountingFilter.java Sat Nov 8 16:05:27 2008 @@ -21,7 +21,6 @@ import org.apache.mina.core.filterchain.IoFilter; import org.apache.mina.core.filterchain.IoFilterAdapter; -import org.apache.mina.core.filterchain.IoFilterChain; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.apache.mina.core.session.TrafficMask; @@ -52,20 +51,20 @@ //no-op, will destroy on-demand in post-remove if count == 0 } - public synchronized void onPreAdd(IoFilterChain parent, String name, - NextFilter nextFilter) throws Exception { + public synchronized void onPreAdd(IoSession session, int index, String name, + IoFilter nextFilter) throws Exception { if (0 == count) { filter.init(); ++count; } - filter.onPreAdd(parent, name, nextFilter); + filter.onPreAdd(session, index, name, nextFilter); } - public synchronized void onPostRemove(IoFilterChain parent, String name, - NextFilter nextFilter) throws Exception { - filter.onPostRemove(parent, name, nextFilter); + public synchronized void onPostRemove(IoSession session, int index, String name, + IoFilter nextFilter) throws Exception { + filter.onPostRemove(session, index, name, nextFilter); --count; @@ -74,63 +73,63 @@ } } - public void exceptionCaught(NextFilter nextFilter, IoSession session, + public void exceptionCaught(int index, IoSession session, Throwable cause) throws Exception { - filter.exceptionCaught(nextFilter, session, cause); + filter.exceptionCaught(index+1, session, cause); } - public void filterClose(NextFilter nextFilter, IoSession session) + public void filterClose(int index, IoSession session) throws Exception { - filter.filterClose(nextFilter, session); + filter.filterClose(index+1, session); } - public void filterWrite(NextFilter nextFilter, IoSession session, + public void filterWrite(int index, IoSession session, WriteRequest writeRequest) throws Exception { - filter.filterWrite(nextFilter, session, writeRequest); + filter.filterWrite(index+1, session, writeRequest); } - public void messageReceived(NextFilter nextFilter, IoSession session, + public void messageReceived(int index, IoSession session, Object message) throws Exception { - filter.messageReceived(nextFilter, session, message); + filter.messageReceived(index+1, session, message); } - public void messageSent(NextFilter nextFilter, IoSession session, + public void messageSent(int index, IoSession session, WriteRequest writeRequest) throws Exception { - filter.messageSent(nextFilter, session, writeRequest); + filter.messageSent(index+1, session, writeRequest); } - public void onPostAdd(IoFilterChain parent, String name, - NextFilter nextFilter) throws Exception { - filter.onPostAdd(parent, name, nextFilter); + public void onPostAdd(IoSession session, int index, String name, + IoFilter nextFilter) throws Exception { + filter.onPostAdd(session, index, name, nextFilter); } - public void onPreRemove(IoFilterChain parent, String name, - NextFilter nextFilter) throws Exception { - filter.onPreRemove(parent, name, nextFilter); + public void onPreRemove(IoSession session, int index, String name, + IoFilter nextFilter) throws Exception { + filter.onPreRemove(session, index, name, nextFilter); } - public void sessionClosed(NextFilter nextFilter, IoSession session) + public void sessionClosed(int index, IoSession session) throws Exception { - filter.sessionClosed(nextFilter, session); + filter.sessionClosed(index+1, session); } - public void sessionCreated(NextFilter nextFilter, IoSession session) + public void sessionCreated(int index, IoSession session) throws Exception { - filter.sessionCreated(nextFilter, session); + filter.sessionCreated(index+1, session); } - public void sessionIdle(NextFilter nextFilter, IoSession session, + public void sessionIdle(int index, IoSession session, IdleStatus status) throws Exception { - filter.sessionIdle(nextFilter, session, status); + filter.sessionIdle(index+1, session, status); } - public void sessionOpened(NextFilter nextFilter, IoSession session) + public void sessionOpened(int index, IoSession session) throws Exception { - filter.sessionOpened(nextFilter, session); + filter.sessionOpened(index+1, session); } - public void filterSetTrafficMask(NextFilter nextFilter, IoSession session, + public void filterSetTrafficMask(int index, IoSession session, TrafficMask trafficMask) throws Exception { - filter.filterSetTrafficMask(nextFilter, session, trafficMask); + filter.filterSetTrafficMask(index+1, session, trafficMask); } } Modified: mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/SessionAttributeInitializingFilter.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/SessionAttributeInitializingFilter.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/SessionAttributeInitializingFilter.java (original) +++ mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/SessionAttributeInitializingFilter.java Sat Nov 8 16:05:27 2008 @@ -140,12 +140,12 @@ * map and forward the event to the next filter. */ @Override - public void sessionCreated(NextFilter nextFilter, IoSession session) + public void sessionCreated(int index, IoSession session) throws Exception { for (Map.Entry<String, Object> e : attributes.entrySet()) { session.setAttribute(e.getKey(), e.getValue()); } - nextFilter.sessionCreated(session); + session.getFilterIn(index).sessionCreated(index+1, session); } } Modified: mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/WriteRequestFilter.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/WriteRequestFilter.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/WriteRequestFilter.java (original) +++ mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/filter/util/WriteRequestFilter.java Sat Nov 8 16:05:27 2008 @@ -36,34 +36,35 @@ */ public abstract class WriteRequestFilter extends IoFilterAdapter { @Override - public void filterWrite(NextFilter nextFilter, IoSession session, + public void filterWrite(int index, IoSession session, WriteRequest writeRequest) throws Exception { - Object filteredMessage = doFilterWrite(nextFilter, session, writeRequest); + Object filteredMessage = doFilterWrite(index+1, session, writeRequest); if (filteredMessage != null && filteredMessage != writeRequest.getMessage()) { - nextFilter.filterWrite( + session.getFilterOut(index).filterWrite(index+1, session, new FilteredWriteRequest( filteredMessage, writeRequest)); } else { - nextFilter.filterWrite(session, writeRequest); + session.getFilterOut(index).filterWrite(index+1, session, writeRequest); } } @Override - public void messageSent(NextFilter nextFilter, IoSession session, + public void messageSent(int index, IoSession session, WriteRequest writeRequest) throws Exception { if (writeRequest instanceof FilteredWriteRequest) { FilteredWriteRequest req = (FilteredWriteRequest) writeRequest; if (req.getParent() == this) { - nextFilter.messageSent(session, req.getParentRequest()); + session.getFilterIn(index).messageSent(index+1, session, + req.getParentRequest()); return; } } - nextFilter.messageSent(session, writeRequest); + session.getFilterIn(index).messageSent(index+1, session, writeRequest); } protected abstract Object doFilterWrite( - NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception; + int index, IoSession session, WriteRequest writeRequest) throws Exception; private class FilteredWriteRequest extends WriteRequestWrapper { private final Object filteredMessage; Modified: mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/proxy/AbstractProxyLogicHandler.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/proxy/AbstractProxyLogicHandler.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/proxy/AbstractProxyLogicHandler.java (original) +++ mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/proxy/AbstractProxyLogicHandler.java Sat Nov 8 16:05:27 2008 @@ -24,7 +24,6 @@ import java.util.Queue; import org.apache.mina.core.buffer.IoBuffer; -import org.apache.mina.core.filterchain.IoFilter.NextFilter; import org.apache.mina.core.future.DefaultWriteFuture; import org.apache.mina.core.future.WriteFuture; import org.apache.mina.core.session.IoSession; @@ -106,7 +105,7 @@ * @param nextFilter Downstream filter to receive data. * @param data Data buffer to be written. */ - protected WriteFuture writeData(final NextFilter nextFilter, + protected WriteFuture writeData(int index, final IoBuffer data) throws UnsupportedEncodingException { // write net data ProxyHandshakeIoBuffer writeBuffer = new ProxyHandshakeIoBuffer(data); @@ -114,7 +113,7 @@ logger.debug(" session write: {}", writeBuffer); WriteFuture writeFuture = new DefaultWriteFuture(getSession()); - getProxyFilter().writeData(nextFilter, getSession(), + getProxyFilter().writeData(index+1, getSession(), new DefaultWriteRequest(writeBuffer, writeFuture), true); return writeFuture; Modified: mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java (original) +++ mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSession.java Sat Nov 8 16:05:27 2008 @@ -34,25 +34,74 @@ * @version $Rev$, $Date$ */ public abstract class NioSession extends AbstractIoSession { - private final List<IoFilter> filterChain = new CopyOnWriteArrayList<IoFilter>(); - - public List<IoFilter> getFilterChain() { - return filterChain; - } + private final List<IoFilter> filterChainIn = new CopyOnWriteArrayList<IoFilter>(); + private final List<IoFilter> filterChainOut = new CopyOnWriteArrayList<IoFilter>(); + /** + * Stores all the filters from the common chain into the incoming and outgoing + * chains for the current session. The chains are copied. + * + * @param filters The chain (it will be used in both direction) + */ public void setFilterChain(List<IoFilter> filters) { if (filters == null) { return; } - filterChain.addAll(filters); + filterChainIn.addAll(filters); + filterChainOut.addAll(filters); + } + + /** + * Stores all the filters from both chains (incoming and outgoing) into + * the current session. The chains are copied. + * + * @param filtersIn The incoming chain + * @param filtersOut The outgoing chain + */ + public void setFilterChain(List<IoFilter> filtersIn, List<IoFilter> filtersOut) { + if ((filtersIn == null) || (filtersOut == null)) { + return; + } + + filterChainIn.addAll(filtersIn); + filterChainOut.addAll(filtersOut); } /** * [EMAIL PROTECTED] */ - public IoFilter getFilter(int index) { - return filterChain.get(index); + public IoFilter getFilterIn(int index) { + return filterChainIn.get(index); + } + + /** + * [EMAIL PROTECTED] + */ + public IoFilter getFilterOut(int index) { + return filterChainOut.get(index); + } + + /** + * [EMAIL PROTECTED] + */ + public List<IoFilter> getFilterChainIn() { + return filterChainIn; + } + + /** + * [EMAIL PROTECTED] + */ + public List<IoFilter> getFilterChainOut() { + return filterChainOut; + } + + public IoFilter getFilterInHead() { + return filterChainIn.get(0); + } + + public IoFilter getFilterOutHead() { + return filterChainOut.get(0); } abstract ByteChannel getChannel(); Modified: mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketSession.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketSession.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketSession.java (original) +++ mina/branches/mina-new-chain2/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketSession.java Sat Nov 8 16:05:27 2008 @@ -23,13 +23,10 @@ import java.net.SocketException; import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; import org.apache.mina.core.RuntimeIoException; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.file.FileRegion; -import org.apache.mina.core.filterchain.IoFilter; import org.apache.mina.core.service.DefaultTransportMetadata; import org.apache.mina.core.service.IoHandler; import org.apache.mina.core.service.IoProcessor; @@ -82,8 +79,9 @@ this.ch = ch; this.handler = service.getHandler(); this.config.setAll(service.getSessionConfig()); - service.getFilterChain().add(service.getTailFilter()); - setFilterChain(service.getFilterChain()); + service.getFilterChainIn().add(service.getTailFilter()); + service.getFilterChainOut().add(service.getTailFilter()); + setFilterChain(service.getFilterChainIn(), service.getFilterChainOut()); } public IoService getService() { Modified: mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/core/IoServiceListenerSupportTest.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/core/IoServiceListenerSupportTest.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/core/IoServiceListenerSupportTest.java (original) +++ mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/core/IoServiceListenerSupportTest.java Sat Nov 8 16:05:27 2008 @@ -36,6 +36,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; +import static org.junit.Assert.fail; /** * Tests [EMAIL PROTECTED] IoServiceListenerSupport}. @@ -190,7 +191,11 @@ // the visibility problem of simultaneous EasyMock // state update. (not sure if it fixes the failing test yet.) synchronized (listener) { - support.fireSessionDestroyed(session); + try { + support.fireSessionDestroyed(session); + } catch (Throwable t) { + fail(); + } } } }.start(); Modified: mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java (original) +++ mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/executor/ExecutorFilterRegressionTest.java Sat Nov 8 16:05:27 2008 @@ -25,7 +25,6 @@ import junit.framework.Assert; import junit.framework.TestCase; -import org.apache.mina.core.filterchain.IoFilter.NextFilter; import org.apache.mina.core.session.DummySession; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; @@ -73,7 +72,7 @@ Integer objI = new Integer(i); for (int j = end; j >= 0; j--) { - filter.messageReceived(nextFilter, sessions[j], objI); + filter.messageReceived(0, sessions[j], objI); } if (nextFilter.throwable != null) { Modified: mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java (original) +++ mina/branches/mina-new-chain2/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java Sat Nov 8 16:05:27 2008 @@ -33,7 +33,7 @@ import org.apache.log4j.Level; import org.apache.log4j.spi.LoggingEvent; import org.apache.mina.core.buffer.IoBuffer; -import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; +import org.apache.mina.core.filterchain.IoFilter; import org.apache.mina.core.filterchain.IoFilterAdapter; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.service.IoHandlerAdapter; @@ -87,77 +87,77 @@ } public void testSimpleChain() throws IOException, InterruptedException { - DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder(); - chain.addFirst("mdc-injector", new MdcInjectionFilter()); - chain.addLast("dummy", new DummyIoFilter()); - chain.addLast("protocol", new ProtocolCodecFilter(new DummyProtocolCodecFactory())); + List<IoFilter> chain = new ArrayList<IoFilter>(); + chain.add(new MdcInjectionFilter()); + chain.add(new DummyIoFilter()); + chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory())); test(chain); } public void testExecutorFilterAtTheEnd() throws IOException, InterruptedException { - DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder(); + List<IoFilter> chain = new ArrayList<IoFilter>(); MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter(); - chain.addFirst("mdc-injector1", mdcInjectionFilter); - chain.addLast("dummy", new DummyIoFilter()); - chain.addLast("protocol", new ProtocolCodecFilter(new DummyProtocolCodecFactory())); - chain.addLast("executor" , new ExecutorFilter()); - chain.addLast("mdc-injector2", mdcInjectionFilter); + chain.add(mdcInjectionFilter); + chain.add(new DummyIoFilter()); + chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory())); + chain.add(new ExecutorFilter()); + chain.add(mdcInjectionFilter); test(chain); } public void testExecutorFilterAtBeginning() throws IOException, InterruptedException { - DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder(); + List<IoFilter> chain = new ArrayList<IoFilter>(); MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter(); - chain.addLast("executor" , new ExecutorFilter()); - chain.addLast("mdc-injector", mdcInjectionFilter); - chain.addLast("dummy", new DummyIoFilter()); - chain.addLast("protocol", new ProtocolCodecFilter(new DummyProtocolCodecFactory())); + chain.add(new ExecutorFilter()); + chain.add(mdcInjectionFilter); + chain.add(new DummyIoFilter()); + chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory())); test(chain); } public void testExecutorFilterBeforeProtocol() throws IOException, InterruptedException { - DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder(); + List<IoFilter> chain = new ArrayList<IoFilter>(); MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter(); - chain.addLast("executor" , new ExecutorFilter()); - chain.addLast("mdc-injector", mdcInjectionFilter); - chain.addLast("dummy", new DummyIoFilter()); - chain.addLast("protocol", new ProtocolCodecFilter(new DummyProtocolCodecFactory())); + chain.add(new ExecutorFilter()); + chain.add(mdcInjectionFilter); + chain.add(new DummyIoFilter()); + chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory())); test(chain); } public void testMultipleFilters() throws IOException, InterruptedException { - DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder(); + List<IoFilter> chain = new ArrayList<IoFilter>(); MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter(); - chain.addLast("executor" , new ExecutorFilter()); - chain.addLast("mdc-injector", mdcInjectionFilter); - chain.addLast("profiler", new ProfilerTimerFilter()); - chain.addLast("dummy", new DummyIoFilter()); - chain.addLast("logger", new LoggingFilter()); - chain.addLast("protocol", new ProtocolCodecFilter(new DummyProtocolCodecFactory())); + chain.add(new ExecutorFilter()); + chain.add(mdcInjectionFilter); + chain.add(new ProfilerTimerFilter()); + chain.add(new DummyIoFilter()); + chain.add(new LoggingFilter()); + chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory())); test(chain); } public void testTwoExecutorFilters() throws IOException, InterruptedException { - DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder(); + List<IoFilter> chain = new ArrayList<IoFilter>(); MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter(); - chain.addLast("executor1" , new ExecutorFilter()); - chain.addLast("mdc-injector1", mdcInjectionFilter); - chain.addLast("protocol", new ProtocolCodecFilter(new DummyProtocolCodecFactory())); - chain.addLast("dummy", new DummyIoFilter()); - chain.addLast("executor2" , new ExecutorFilter()); + chain.add(new ExecutorFilter()); + chain.add(mdcInjectionFilter); + chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory())); + chain.add(new DummyIoFilter()); + chain.add(new ExecutorFilter()); // add the MdcInjectionFilter instance after every ExecutorFilter // it's important to use the same MdcInjectionFilter instance - chain.addLast("mdc-injector2", mdcInjectionFilter); + chain.add(mdcInjectionFilter); test(chain); } public void testOnlyRemoteAddress() throws IOException, InterruptedException { - DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder(); - chain.addFirst("mdc-injector", new MdcInjectionFilter( + List<IoFilter> chain = new ArrayList<IoFilter>(); + chain.add(new MdcInjectionFilter( MdcInjectionFilter.MdcKey.remoteAddress)); - chain.addLast("dummy", new DummyIoFilter()); - chain.addLast("protocol", new ProtocolCodecFilter(new DummyProtocolCodecFactory())); + chain.add(new DummyIoFilter()); + chain.add(new ProtocolCodecFilter(new DummyProtocolCodecFactory())); SimpleIoHandler simpleIoHandler = new SimpleIoHandler(); acceptor.setHandler(simpleIoHandler); acceptor.bind(new InetSocketAddress(0)); @@ -191,7 +191,7 @@ } } - private void test(DefaultIoFilterChainBuilder chain) throws IOException, InterruptedException { + private void test(List<IoFilter> chain) throws IOException, InterruptedException { // configure the server SimpleIoHandler simpleIoHandler = new SimpleIoHandler(); acceptor.setHandler(simpleIoHandler); @@ -381,9 +381,9 @@ private static class DummyIoFilter extends IoFilterAdapter { @Override - public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception { + public void sessionOpened(int index, IoSession session) throws Exception { logger.info("DummyIoFilter.sessionOpened"); - nextFilter.sessionOpened(session); + session.getFilter(index).sessionOpened(index+1, session); } } Modified: mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/Main.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/Main.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/Main.java (original) +++ mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/Main.java Sat Nov 8 16:05:27 2008 @@ -46,20 +46,26 @@ public static void main(String[] args) throws Exception { NioSocketAcceptor acceptor = new NioSocketAcceptor(); - List<IoFilter> chain = acceptor.getFilterChain(); - - MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter(); - chain.add(mdcInjectionFilter); + List<IoFilter> chainIn = acceptor.getFilterChainIn(); + List<IoFilter> chainOut = acceptor.getFilterChainOut(); + ProtocolCodecFilter codecFilter = new ProtocolCodecFilter( + new TextLineCodecFactory()); // Add SSL filter if SSL is enabled. if (USE_SSL) { - addSSLSupport(chain); + addSSLSupport(chainIn); } - chain.add(new ProtocolCodecFilter( - new TextLineCodecFactory())); + MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter(); + chainIn.add(mdcInjectionFilter); + + chainIn.add(codecFilter); - addLogger(chain); + addLogger(chainIn); + + addLogger(chainOut); + chainOut.add(codecFilter); + chainOut.add(mdcInjectionFilter); // Bind acceptor.setHandler(new ChatProtocolHandler()); Modified: mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java URL: http://svn.apache.org/viewvc/mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java?rev=712452&r1=712451&r2=712452&view=diff ============================================================================== --- mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java (original) +++ mina/branches/mina-new-chain2/example/src/main/java/org/apache/mina/example/chat/client/ChatClientSupport.java Sat Nov 8 16:05:27 2008 @@ -69,18 +69,23 @@ IoFilter CODEC_FILTER = new ProtocolCodecFilter( new TextLineCodecFactory()); - connector.getFilterChain().add(new MdcInjectionFilter()); - connector.getFilterChain().add(CODEC_FILTER); - connector.getFilterChain().add(LOGGING_FILTER); + connector.getFilterChainIn().add(new MdcInjectionFilter()); + connector.getFilterChainIn().add(CODEC_FILTER); + connector.getFilterChainIn().add(LOGGING_FILTER); if (useSsl) { SSLContext sslContext = BogusSslContextFactory .getInstance(false); SslFilter sslFilter = new SslFilter(sslContext); sslFilter.setUseClientMode(true); - connector.getFilterChain().add(sslFilter); + connector.getFilterChainIn().add(sslFilter); + connector.getFilterChainOut().add(sslFilter); } + connector.getFilterChainOut().add(LOGGING_FILTER); + connector.getFilterChainOut().add(CODEC_FILTER); + connector.getFilterChainOut().add(new MdcInjectionFilter()); + connector.setHandler(handler); ConnectFuture future1 = connector.connect(address); future1.awaitUninterruptibly();