You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2007/08/14 15:30:01 UTC

svn commit: r565742 - in /mina/trunk/core/src: main/java/org/apache/mina/filter/codec/ main/java/org/apache/mina/filter/codec/support/ test/java/org/apache/mina/filter/codec/serialization/ test/java/org/apache/mina/filter/codec/textline/

Author: trustin
Date: Tue Aug 14 06:30:00 2007
New Revision: 565742

URL: http://svn.apache.org/viewvc?view=rev&rev=565742
Log:
* Moved classes in filter.codec.support to filter.codec
* Renamed SimpleProtocolEncoderOutput to AbstractProtocolEncoderOutput
* Renamed SimpleProtocolDecoderOutput to AbstractProtocolDecoderOutput
* Simplified AbstractProtocolDecoderOutput so anyone can extend it, and moved complicated part to ProtocolCodecFilter


Added:
    mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java   (with props)
    mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java   (with props)
Removed:
    mina/trunk/core/src/main/java/org/apache/mina/filter/codec/support/
Modified:
    mina/trunk/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
    mina/trunk/core/src/test/java/org/apache/mina/filter/codec/serialization/ObjectSerializationTest.java
    mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java

Added: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java?view=auto&rev=565742
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java (added)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java Tue Aug 14 06:30:00 2007
@@ -0,0 +1,49 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.mina.filter.codec;
+
+import java.util.LinkedList;
+import java.util.Queue;
+
+/**
+ * A {@link ProtocolDecoderOutput} based on queue.
+ * 
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ * @version $Rev$, $Date$
+ *
+ */
+public abstract class AbstractProtocolDecoderOutput implements ProtocolDecoderOutput {
+    private final Queue<Object> messageQueue = new LinkedList<Object>();
+
+    public AbstractProtocolDecoderOutput() {
+    }
+    
+    public Queue<Object> getMessageQueue() {
+        return messageQueue;
+    }
+
+    public void write(Object message) {
+        if (message == null) {
+            throw new NullPointerException("message");
+        }
+
+        messageQueue.offer(message);
+    }
+}

Propchange: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java?view=auto&rev=565742
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java (added)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java Tue Aug 14 06:30:00 2007
@@ -0,0 +1,109 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.mina.filter.codec;
+
+import java.util.LinkedList;
+import java.util.Queue;
+
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.WriteFuture;
+
+/**
+ * A {@link ProtocolEncoderOutput} based on queue.
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ * @version $Rev$, $Date$
+ */
+public abstract class AbstractProtocolEncoderOutput implements
+        ProtocolEncoderOutput {
+    private final Queue<ByteBuffer> bufferQueue = new LinkedList<ByteBuffer>();
+
+    public AbstractProtocolEncoderOutput() {
+    }
+
+    public Queue<ByteBuffer> getBufferQueue() {
+        return bufferQueue;
+    }
+
+    public void write(ByteBuffer buf) {
+        if (buf.hasRemaining()) {
+            bufferQueue.offer(buf);
+        } else {
+            throw new IllegalArgumentException(
+                    "buf is empty. Forgot to call flip()?");
+        }
+    }
+
+    public void mergeAll() {
+        int sum = 0;
+        final int size = bufferQueue.size();
+
+        if (size < 2) {
+            // no need to merge!
+            return;
+        }
+
+        // Get the size of merged BB
+        for (ByteBuffer b : bufferQueue) {
+            sum += b.remaining();
+        }
+
+        // Allocate a new BB that will contain all fragments
+        ByteBuffer newBuf = ByteBuffer.allocate(sum);
+
+        // and merge all.
+        for (;;) {
+            ByteBuffer buf = bufferQueue.poll();
+            if (buf == null) {
+                break;
+            }
+
+            newBuf.put(buf);
+        }
+
+        // Push the new buffer finally.
+        newBuf.flip();
+        bufferQueue.offer(newBuf);
+    }
+
+    public WriteFuture flush() {
+        Queue<ByteBuffer> bufferQueue = this.bufferQueue;
+        WriteFuture future = null;
+        if (bufferQueue.isEmpty()) {
+            return null;
+        } else {
+            for (;;) {
+                ByteBuffer buf = bufferQueue.poll();
+                if (buf == null) {
+                    break;
+                }
+
+                // Flush only when the buffer has remaining.
+                if (buf.hasRemaining()) {
+                    future = doFlush(buf);
+                }
+            }
+        }
+
+        return future;
+    }
+
+    protected abstract WriteFuture doFlush(ByteBuffer buf);
+}
\ No newline at end of file

Propchange: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: mina/trunk/core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolEncoderOutput.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

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?view=diff&rev=565742&r1=565741&r2=565742
==============================================================================
--- 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 Aug 14 06:30:00 2007
@@ -20,7 +20,9 @@
 package org.apache.mina.filter.codec;
 
 import java.net.SocketAddress;
+import java.util.Queue;
 
+import org.apache.mina.common.AbstractIoSession;
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.DefaultWriteFuture;
 import org.apache.mina.common.DefaultWriteRequest;
@@ -32,8 +34,6 @@
 import org.apache.mina.common.WriteFuture;
 import org.apache.mina.common.WriteRequest;
 import org.apache.mina.common.WriteRequestWrapper;
-import org.apache.mina.filter.codec.support.SimpleProtocolDecoderOutput;
-import org.apache.mina.filter.codec.support.SimpleProtocolEncoderOutput;
 
 /**
  * An {@link IoFilter} which translates binary or protocol specific data into
@@ -280,7 +280,7 @@
             NextFilter nextFilter) {
         ProtocolDecoderOutput out = (ProtocolDecoderOutput) session.getAttribute(DECODER_OUT);
         if (out == null) {
-            out = new SimpleProtocolDecoderOutput(session, nextFilter);
+            out = new ProtocolDecoderOutputImpl(session, nextFilter);
             session.setAttribute(DECODER_OUT, out);
         }
         return out;
@@ -337,9 +337,36 @@
             return EMPTY_BUFFER;
         }
     }
+    
+    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;
+        }
+
+        @Override
+        public void write(Object message) {
+            super.write(message);
+            if (session instanceof AbstractIoSession) {
+                ((AbstractIoSession) session).increaseReadMessages();
+            }
+        }
+
+        public void flush() {
+            Queue<Object> messageQueue = getMessageQueue();
+            while (!messageQueue.isEmpty()) {
+                nextFilter.messageReceived(session, messageQueue.poll());
+            }
+        }
+    }
 
     private static class ProtocolEncoderOutputImpl extends
-            SimpleProtocolEncoderOutput {
+            AbstractProtocolEncoderOutput {
         private final IoSession session;
 
         private final NextFilter nextFilter;

Modified: mina/trunk/core/src/test/java/org/apache/mina/filter/codec/serialization/ObjectSerializationTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/codec/serialization/ObjectSerializationTest.java?view=diff&rev=565742&r1=565741&r2=565742
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/filter/codec/serialization/ObjectSerializationTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/filter/codec/serialization/ObjectSerializationTest.java Tue Aug 14 06:30:00 2007
@@ -39,7 +39,7 @@
 import org.apache.mina.filter.codec.ProtocolDecoder;
 import org.apache.mina.filter.codec.ProtocolDecoderOutput;
 import org.apache.mina.filter.codec.ProtocolEncoder;
-import org.apache.mina.filter.codec.support.SimpleProtocolEncoderOutput;
+import org.apache.mina.filter.codec.AbstractProtocolEncoderOutput;
 
 /**
  * Tests object serialization codec and streams.
@@ -52,7 +52,7 @@
         final String expected = "1234";
 
         IoSession session = new MockIoSession();
-        SimpleProtocolEncoderOutput out = new SimpleProtocolEncoderOutput() {
+        AbstractProtocolEncoderOutput out = new AbstractProtocolEncoderOutput() {
             @Override
             protected WriteFuture doFlush(ByteBuffer buf) {
                 return null;

Modified: mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java?view=diff&rev=565742&r1=565741&r2=565742
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineEncoderTest.java Tue Aug 14 06:30:00 2007
@@ -34,7 +34,7 @@
 import org.apache.mina.common.IoSessionConfig;
 import org.apache.mina.common.IoServiceMetadata;
 import org.apache.mina.common.WriteFuture;
-import org.apache.mina.filter.codec.support.SimpleProtocolEncoderOutput;
+import org.apache.mina.filter.codec.AbstractProtocolEncoderOutput;
 
 /**
  * Tests {@link TextLineEncoder}.
@@ -51,7 +51,7 @@
         TextLineEncoder encoder = new TextLineEncoder(Charset.forName("UTF-8"),
                 LineDelimiter.WINDOWS);
         IoSession session = new DummySession();
-        SimpleProtocolEncoderOutput out = new SimpleProtocolEncoderOutput() {
+        AbstractProtocolEncoderOutput out = new AbstractProtocolEncoderOutput() {
             @Override
             protected WriteFuture doFlush(ByteBuffer buf) {
                 return null;