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 2008/11/11 20:32:27 UTC
svn commit: r713125 - in /mina/trunk:
core/src/main/java/org/apache/mina/filter/codec/
core/src/main/java/org/apache/mina/filter/codec/statemachine/
example/src/main/java/org/apache/mina/example/tapedeck/
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 {@link ProtocolDecoder} to generate decoded messages.
* {@link ProtocolDecoder} must call {@link #write(Object)} for each decoded
@@ -41,5 +44,5 @@
* Flushes all messages you wrote via {@link #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) {