[ 
https://issues.apache.org/jira/browse/DIRMINA-982?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14117185#comment-14117185
 ] 

Jenya Pisarenko commented on DIRMINA-982:
-----------------------------------------

I'm looking at the 2.0 source. The {{ProtocolEncoderOutputImpl.flush()}} here 
looks as follows:
{code:java}
        public WriteFuture flush() {
            Queue<Object> bufferQueue = getMessageQueue();
            WriteFuture future = null;

            while (!bufferQueue.isEmpty()) {
                Object encodedMessage = bufferQueue.poll();

                if (encodedMessage == null) {
                    break;
                }

                // Flush only when the buffer has remaining.
                if (!(encodedMessage instanceof IoBuffer) || ((IoBuffer) 
encodedMessage).hasRemaining()) {
                    future = new DefaultWriteFuture(session);
                    nextFilter.filterWrite(session, new 
EncodedWriteRequest(encodedMessage, future, destination));
                }
            }

            if (future == null) {
                // Creates an empty writeRequest containing the destination
                WriteRequest writeRequest = new DefaultWriteRequest(null, null, 
destination);
                future = DefaultWriteFuture.newNotWrittenFuture(session, new 
NothingWrittenException(writeRequest));
            }

            return future;
        }
{code}
Queue iteration part is ok. As future variable is assigned only in a loop, The 
last if consequent is invoked, when the loop condition is never true within the 
method, i.e. {{bufferQueue.isEmpty() == true}} by the {{flush()}} call. It 
should be possible to achieve in two sequential {{flush()}} calls without any 
concurrency (assuming the {{getMessageQueue()}} can return an empty collection).

The first line of the if block:
{code:java}
                // Creates an empty writeRequest containing the destination
                WriteRequest writeRequest = new DefaultWriteRequest(null, null, 
destination);
{code}
always fails, because of the {{IllegalArgumentException}}, thus the rest of it:
{code:java}
                future = DefaultWriteFuture.newNotWrittenFuture(session, new 
NothingWrittenException(writeRequest));
{code}
is never executed.

I suggest to fix the last part of the method so it could correctly create an 
empty write request/write future.

> ProtocolEncoderOutputImpl.flush() throws an IllegalArgumentException if 
> buffers queue is empty
> ----------------------------------------------------------------------------------------------
>
>                 Key: DIRMINA-982
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-982
>             Project: MINA
>          Issue Type: Bug
>    Affects Versions: 2.0.7
>            Reporter: Jenya Pisarenko
>
> https://git-wip-us.apache.org/repos/asf?p=mina.git;a=blob;f=mina-core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java;h=f413491e058ff1c5a24c3b2ccae6d736f481bbaf;hb=2.0#l428
> First, flush method initializes WriteFuture with a null reference.
> The object can be constructed later, if buffers queue isn't empty, but 
> otherwise remains untouched. 
> If it still holds a null reference, the DefaultWriteRequest constructor call 
> always fails, as it doesn't accept null as a message param.
> Excerpt from the stack trace:
> {noformat}
> Caused by: java.lang.IllegalArgumentException: message
> at 
> org.apache.mina.core.write.DefaultWriteRequest.<init>(DefaultWriteRequest.java:133)
> at 
> org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolEncoderOutputImpl.flush(ProtocolCodecFilter.java:448)
> at com.ugcs.messaging.mina.MinaEncoder.encode(MinaEncoder.java:27)
> at 
> org.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:308)
> ... 33 more
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to