Author: elecharny Date: Tue Nov 11 11:32:26 2008 New Revision: 713125 URL: http://svn.apache.org/viewvc?rev=713125&view=rev Log: Fixed DIRMINA-636 and DIRMINA-635: o removing the NextFilter and IoSession parameters to the ProtocolDecoderOutput constructor o adding those parameters to the fulsh() method o calling a common initializer for the encoder/decoder into the preAdd and sessionCreated methods o The very same for the dispose encoder/decoder
Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecSession.java mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderOutput.java mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateMachine.java mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/CommandDecoder.java Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java?rev=713125&r1=713124&r2=713125&view=diff ============================================================================== --- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java (original) +++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java Tue Nov 11 11:32:26 2008 @@ -185,18 +185,16 @@ throw new IllegalArgumentException( "You can't add the same filter instance more than once. Create another instance and add it."); } + + // Initialize the encoder and decoder + initCodec(parent.getSession()); } @Override public void onPostRemove(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception { - // We just remove the two instances of encoder/decoder to release resources - // from the session - disposeEncoder(parent.getSession()); - disposeDecoder(parent.getSession()); - - // We also remove the callback - disposeDecoderOut(parent.getSession()); + // Clean everything + disposeCodec(parent.getSession()); } /** @@ -262,7 +260,7 @@ } // Finish decoding if no exception was thrown. - decoderOut.flush(); + decoderOut.flush(nextFilter, session); } catch (Throwable t) { ProtocolDecoderException pde; if (t instanceof ProtocolDecoderException) { @@ -280,7 +278,7 @@ } // Fire the exceptionCaught event. - decoderOut.flush(); + decoderOut.flush(nextFilter, session); nextFilter.exceptionCaught(session, pde); // Retry only if the type of the caught exception is @@ -390,13 +388,8 @@ */ @Override public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception { - // Creates the decoder and stores it into the newly created session - ProtocolDecoder decoder = factory.getDecoder(session); - session.setAttribute(DECODER, decoder); - - // Creates the encoder and stores it into the newly created session - ProtocolEncoder encoder = factory.getEncoder(session); - session.setAttribute(ENCODER, encoder); + // Initialized the encoder and decoder + initCodec(session); // Call the next filter nextFilter.sessionCreated(session); @@ -407,19 +400,6 @@ throws Exception { // Call finishDecode() first when a connection is closed. ProtocolDecoder decoder = getDecoder(session); - - if ( decoder == null) { - // The decoder must not be null. It's null if - // the sessionCreated message has not be called, for - // instance if the filter has been added after the - // first session is created. - ProtocolDecoderException pde = new ProtocolDecoderException( - "Cannot decode if the decoder is null. Add the filter in the chain" + - "before the first session is created" ); - nextFilter.exceptionCaught(session, pde); - return; - } - ProtocolDecoderOutput decoderOut = getDecoderOut(session, nextFilter); if ( decoderOut == null) { @@ -445,13 +425,12 @@ } throw pde; } finally { - // Dispose all. - disposeEncoder(session); - disposeDecoder(session); - disposeDecoderOut(session); - decoderOut.flush(); + // Dispose everything + disposeCodec(session); + decoderOut.flush(nextFilter, session); } + // Call the next filter nextFilter.sessionClosed(session); } @@ -464,46 +443,12 @@ NextFilter nextFilter) { ProtocolDecoderOutput out = (ProtocolDecoderOutput) session.getAttribute(DECODER_OUT); if (out == null) { - out = new ProtocolDecoderOutputImpl(session, nextFilter); + out = new ProtocolDecoderOutputImpl(); session.setAttribute(DECODER_OUT, out); } return out; } - private void disposeEncoder(IoSession session) { - ProtocolEncoder encoder = (ProtocolEncoder) session - .removeAttribute(ENCODER); - if (encoder == null) { - return; - } - - try { - encoder.dispose(session); - } catch (Throwable t) { - logger.warn( - "Failed to dispose: " + encoder.getClass().getName() + " (" + encoder + ')'); - } - } - - private void disposeDecoder(IoSession session) { - ProtocolDecoder decoder = (ProtocolDecoder) session - .removeAttribute(DECODER); - if (decoder == null) { - return; - } - - try { - decoder.dispose(session); - } catch (Throwable t) { - logger.warn( - "Falied to dispose: " + decoder.getClass().getName() + " (" + decoder + ')'); - } - } - - private void disposeDecoderOut(IoSession session) { - session.removeAttribute(DECODER_OUT); - } - private static class EncodedWriteRequest extends DefaultWriteRequest { private EncodedWriteRequest(Object encodedMessage, WriteFuture future, SocketAddress destination) { @@ -524,16 +469,10 @@ private static class ProtocolDecoderOutputImpl extends AbstractProtocolDecoderOutput { - private final IoSession session; - private final NextFilter nextFilter; - - public ProtocolDecoderOutputImpl( - IoSession session, NextFilter nextFilter) { - this.session = session; - this.nextFilter = nextFilter; + public ProtocolDecoderOutputImpl() { } - public void flush() { + public void flush(NextFilter nextFilter, IoSession session) { Queue<Object> messageQueue = getMessageQueue(); while (!messageQueue.isEmpty()) { nextFilter.messageReceived(session, messageQueue.poll()); @@ -601,4 +540,80 @@ } } } + + //----------- Helper methods --------------------------------------------- + /** + * Initialize the encoder and the decoder, storing them in the + * session attributes. + */ + private void initCodec(IoSession session) throws Exception { + // Creates the decoder and stores it into the newly created session + ProtocolDecoder decoder = factory.getDecoder(session); + session.setAttribute(DECODER, decoder); + + // Creates the encoder and stores it into the newly created session + ProtocolEncoder encoder = factory.getEncoder(session); + session.setAttribute(ENCODER, encoder); + } + + /** + * Dispose the encoder, decoder, and the callback for the decoded + * messages. + */ + private void disposeCodec(IoSession session) { + // We just remove the two instances of encoder/decoder to release resources + // from the session + disposeEncoder(session); + disposeDecoder(session); + + // We also remove the callback + disposeDecoderOut(session); + } + + /** + * dispose the encoder, removing its instance from the + * session's attributes, and calling the associated + * dispose method. + */ + private void disposeEncoder(IoSession session) { + ProtocolEncoder encoder = (ProtocolEncoder) session + .removeAttribute(ENCODER); + if (encoder == null) { + return; + } + + try { + encoder.dispose(session); + } catch (Throwable t) { + logger.warn( + "Failed to dispose: " + encoder.getClass().getName() + " (" + encoder + ')'); + } + } + + /** + * dispose the decoder, removing its instance from the + * session's attributes, and calling the associated + * dispose method. + */ + private void disposeDecoder(IoSession session) { + ProtocolDecoder decoder = (ProtocolDecoder) session + .removeAttribute(DECODER); + if (decoder == null) { + return; + } + + try { + decoder.dispose(session); + } catch (Throwable t) { + logger.warn( + "Falied to dispose: " + decoder.getClass().getName() + " (" + decoder + ')'); + } + } + + /** + * Remove the decoder callback from the session's attributes. + */ + private void disposeDecoderOut(IoSession session) { + session.removeAttribute(DECODER_OUT); + } } Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecSession.java URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecSession.java?rev=713125&r1=713124&r2=713125&view=diff ============================================================================== --- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecSession.java (original) +++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecSession.java Tue Nov 11 11:32:26 2008 @@ -22,6 +22,7 @@ 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.DummySession; @@ -71,7 +72,7 @@ private final AbstractProtocolDecoderOutput decoderOutput = new AbstractProtocolDecoderOutput() { - public void flush() { + public void flush(NextFilter nextFilter, IoSession session) { } }; Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderOutput.java URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderOutput.java?rev=713125&r1=713124&r2=713125&view=diff ============================================================================== --- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderOutput.java (original) +++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoderOutput.java Tue Nov 11 11:32:26 2008 @@ -19,6 +19,9 @@ */ package org.apache.mina.filter.codec; +import org.apache.mina.core.filterchain.IoFilter.NextFilter; +import org.apache.mina.core.session.IoSession; + /** * Callback for [EMAIL PROTECTED] ProtocolDecoder} to generate decoded messages. * [EMAIL PROTECTED] ProtocolDecoder} must call [EMAIL PROTECTED] #write(Object)} for each decoded @@ -41,5 +44,5 @@ * Flushes all messages you wrote via [EMAIL PROTECTED] #write(Object)} to * the next filter. */ - void flush(); + void flush(NextFilter nextFilter, IoSession session); } Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateMachine.java URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateMachine.java?rev=713125&r1=713124&r2=713125&view=diff ============================================================================== --- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateMachine.java (original) +++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/statemachine/DecodingStateMachine.java Tue Nov 11 11:32:26 2008 @@ -23,6 +23,8 @@ import java.util.List; import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.filterchain.IoFilter.NextFilter; +import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.ProtocolDecoderOutput; import org.slf4j.Logger; @@ -53,7 +55,7 @@ private final List<Object> childProducts = new ArrayList<Object>(); private final ProtocolDecoderOutput childOutput = new ProtocolDecoderOutput() { - public void flush() { + public void flush(NextFilter nextFilter, IoSession session) { } public void write(Object message) { Modified: mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/CommandDecoder.java URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/CommandDecoder.java?rev=713125&r1=713124&r2=713125&view=diff ============================================================================== --- mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/CommandDecoder.java (original) +++ mina/trunk/example/src/main/java/org/apache/mina/example/tapedeck/CommandDecoder.java Tue Nov 11 11:32:26 2008 @@ -23,6 +23,7 @@ import java.util.LinkedList; import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.filterchain.IoFilter.NextFilter; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolDecoder; import org.apache.mina.filter.codec.ProtocolDecoderOutput; @@ -94,7 +95,7 @@ public void write(Object message) { lines.add((String) message); } - public void flush() {} + public void flush(NextFilter nextFilter, IoSession session) {} }); for (String s: lines) {