Author: trustin
Date: Mon Nov  5 22:20:12 2007
New Revision: 592298

URL: http://svn.apache.org/viewvc?rev=592298&view=rev
Log:
Resolved issue: DIRMINA-428 (MessagePriorities)
* Renamed IoSessionAttributeMapFactory to IoSessionDataStructureFactory
** IoSessionDataStructure has additional method 'getWriteRequestQueue' which 
allows a user to provide his or her own queue implementation, possibly 
prioritized queue.


Added:
    
mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoSessionDataStructureFactory.java
      - copied, changed from r592267, 
mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoSessionAttributeMapFactory.java
    
mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionDataStructureFactory.java
      - copied, changed from r592267, 
mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionAttributeMapFactory.java
Removed:
    
mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoSessionAttributeMapFactory.java
    
mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionAttributeMapFactory.java
Modified:
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java
    mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java
    mina/trunk/core/src/main/java/org/apache/mina/common/DummySession.java
    mina/trunk/core/src/main/java/org/apache/mina/common/IoService.java

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java?rev=592298&r1=592297&r2=592298&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java 
(original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoService.java 
Mon Nov  5 22:20:12 2007
@@ -43,8 +43,8 @@
      */
     private IoHandler handler;
     
-    private IoSessionAttributeMapFactory sessionAttributeMapFactory =
-        new DefaultIoSessionAttributeMapFactory();
+    private IoSessionDataStructureFactory sessionDataStructureFactory =
+        new DefaultIoSessionDataStructureFactory();
 
     /**
      * Maintains the [EMAIL PROTECTED] IoServiceListener}s of this service.
@@ -140,21 +140,21 @@
         return sessionConfig;
     }
 
-    public IoSessionAttributeMapFactory getSessionAttributeMapFactory() {
-        return sessionAttributeMapFactory;
+    public IoSessionDataStructureFactory getSessionDataStructureFactory() {
+        return sessionDataStructureFactory;
     }
 
-    public void setSessionAttributeMapFactory(IoSessionAttributeMapFactory 
sessionAttributeMapFactory) {
-        if (sessionAttributeMapFactory == null) {
-            throw new NullPointerException("sessionAttributeMapFactory");
+    public void setSessionDataStructureFactory(IoSessionDataStructureFactory 
sessionDataStructureFactory) {
+        if (sessionDataStructureFactory == null) {
+            throw new NullPointerException("sessionDataStructureFactory");
         }
 
         if (isActive()) {
             throw new IllegalStateException(
-                    "sessionAttributeMapFactory cannot be set while the 
service is active.");
+                    "sessionDataStructureFactory cannot be set while the 
service is active.");
         }
 
-        this.sessionAttributeMapFactory = sessionAttributeMapFactory;
+        this.sessionDataStructureFactory = sessionDataStructureFactory;
     }
 
     public long getReadBytes() {
@@ -240,15 +240,25 @@
         // Every property but attributeMap should be set now.
         // Now initialize the attributeMap.  The reason why we initialize
         // the attributeMap at last is to make sure all session properties
-        // such as remoteAddress are provided to IoSessionAttributeMapFactory.
+        // such as remoteAddress are provided to IoSessionDataStructureFactory.
         try {
             ((AbstractIoSession) session).setAttributeMap(
-                    
session.getService().getSessionAttributeMapFactory().getAttributeMap(session));
+                    
session.getService().getSessionDataStructureFactory().getAttributeMap(session));
         } catch (IoSessionInitializationException e) {
             throw e;
         } catch (Exception e) {
             throw new IoSessionInitializationException(
-                    "Failed to initialize sessionAttributeMap.", e);
+                    "Failed to initialize an attributeMap.", e);
+        }
+
+        try {
+            ((AbstractIoSession) session).setWriteRequestQueue(
+                    
session.getService().getSessionDataStructureFactory().getWriteRequestQueue(session));
+        } catch (IoSessionInitializationException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new IoSessionInitializationException(
+                    "Failed to initialize a writeRequestQueue.", e);
         }
 
         if (future != null && future instanceof ConnectFuture) {

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java?rev=592298&r1=592297&r2=592298&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java 
(original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoSession.java 
Mon Nov  5 22:20:12 2007
@@ -24,15 +24,14 @@
 import java.io.IOException;
 import java.net.SocketAddress;
 import java.nio.channels.FileChannel;
+import java.util.Collection;
+import java.util.Iterator;
 import java.util.Queue;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.mina.util.CircularQueue;
-import org.apache.mina.util.SynchronizedQueue;
-
 
 /**
  * Base implementation of [EMAIL PROTECTED] IoSession}.
@@ -59,37 +58,9 @@
         new DefaultWriteRequest(new Object());
 
     private final Object lock = new Object();
-
+    
     private IoSessionAttributeMap attributes;
-
-    private final Queue<WriteRequest> writeRequestQueue =
-        new SynchronizedQueue<WriteRequest>(new 
CircularQueue<WriteRequest>(512)) {
-
-            private static final long serialVersionUID = 6579730560333933524L;
-
-            // Discard close request offered by closeOnFlush() silently.
-            @Override
-            public synchronized WriteRequest peek() {
-                WriteRequest answer = super.peek();
-                if (answer == CLOSE_REQUEST) {
-                    AbstractIoSession.this.close();
-                    clear();
-                    answer = null;
-                }
-                return answer;
-            }
-
-            @Override
-            public synchronized WriteRequest poll() {
-                WriteRequest answer = super.poll();
-                if (answer == CLOSE_REQUEST) {
-                    AbstractIoSession.this.close();
-                    clear();
-                    answer = null;
-                }
-                return answer;
-            }
-    };
+    private Queue<WriteRequest> writeRequestQueue;
 
     private final long creationTime;
 
@@ -99,7 +70,6 @@
     private final CloseFuture closeFuture = new DefaultCloseFuture(this);
 
     private volatile boolean closing;
-
     private volatile TrafficMask trafficMask = TrafficMask.ALL;
 
     // Status variables
@@ -315,6 +285,10 @@
     protected void setAttributeMap(IoSessionAttributeMap attributes) {
         this.attributes = attributes;
     }
+    
+    protected void setWriteRequestQueue(Queue<WriteRequest> writeRequestQueue) 
{
+        this.writeRequestQueue = new WriteRequestQueue(writeRequestQueue);
+    }
 
     public TrafficMask getTrafficMask() {
         return trafficMask;
@@ -612,6 +586,100 @@
             return "null";
         } else {
             return tm.getName();
+        }
+    }
+    
+    private class WriteRequestQueue implements Queue<WriteRequest> {
+        
+        private final Queue<WriteRequest> q;
+        
+        public WriteRequestQueue(Queue<WriteRequest> q) {
+            this.q = q;
+        }
+
+        // Discard close request offered by closeOnFlush() silently.
+        public WriteRequest peek() {
+            WriteRequest answer = q.peek();
+            if (answer == CLOSE_REQUEST) {
+                AbstractIoSession.this.close();
+                clear();
+                answer = null;
+            }
+            return answer;
+        }
+
+        public synchronized WriteRequest poll() {
+            WriteRequest answer = q.poll();
+            if (answer == CLOSE_REQUEST) {
+                AbstractIoSession.this.close();
+                clear();
+                answer = null;
+            }
+            return answer;
+        }
+
+        public boolean add(WriteRequest e) {
+            return q.add(e);
+        }
+
+        public WriteRequest element() {
+            return q.element();
+        }
+
+        public boolean offer(WriteRequest e) {
+            return q.offer(e);
+        }
+
+        public WriteRequest remove() {
+            return q.remove();
+        }
+
+        public boolean addAll(Collection<? extends WriteRequest> c) {
+            return q.addAll(c);
+        }
+
+        public void clear() {
+            q.clear();
+        }
+
+        public boolean contains(Object o) {
+            return q.contains(o);
+        }
+
+        public boolean containsAll(Collection<?> c) {
+            return q.containsAll(c);
+        }
+
+        public boolean isEmpty() {
+            return q.isEmpty();
+        }
+
+        public Iterator<WriteRequest> iterator() {
+            return q.iterator();
+        }
+
+        public boolean remove(Object o) {
+            return q.remove(o);
+        }
+
+        public boolean removeAll(Collection<?> c) {
+            return q.removeAll(c);
+        }
+
+        public boolean retainAll(Collection<?> c) {
+            return q.retainAll(c);
+        }
+
+        public int size() {
+            return q.size();
+        }
+
+        public Object[] toArray() {
+            return q.toArray();
+        }
+
+        public <T> T[] toArray(T[] a) {
+            return q.toArray(a);
         }
     }
 }

Copied: 
mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoSessionDataStructureFactory.java
 (from r592267, 
mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoSessionAttributeMapFactory.java)
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoSessionDataStructureFactory.java?p2=mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoSessionDataStructureFactory.java&p1=mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoSessionAttributeMapFactory.java&r1=592267&r2=592298&rev=592298&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoSessionAttributeMapFactory.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/common/DefaultIoSessionDataStructureFactory.java
 Mon Nov  5 22:20:12 2007
@@ -23,24 +23,34 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Queue;
 import java.util.Set;
 
+import org.apache.mina.util.CircularQueue;
+import org.apache.mina.util.SynchronizedQueue;
+
 /**
- * The default [EMAIL PROTECTED] IoSessionAttributeMapFactory} implementation
+ * The default [EMAIL PROTECTED] IoSessionDataStructureFactory} implementation
  * that creates a new [EMAIL PROTECTED] HashMap}-based [EMAIL PROTECTED] 
IoSessionAttributeMap}
- * instance per [EMAIL PROTECTED] IoSession}.
+ * instance and a new synchronized [EMAIL PROTECTED] CircularQueue} instance 
per
+ * [EMAIL PROTECTED] IoSession}.
  * 
  * @author The Apache MINA Project ([EMAIL PROTECTED])
  * @version $Rev$, $Date$
  */
-public class DefaultIoSessionAttributeMapFactory implements
-        IoSessionAttributeMapFactory {
+public class DefaultIoSessionDataStructureFactory implements
+        IoSessionDataStructureFactory {
 
     public IoSessionAttributeMap getAttributeMap(IoSession session)
             throws Exception {
         return new DefaultIoSessionAttributeMap();
     }
     
+    public Queue<WriteRequest> getWriteRequestQueue(IoSession session)
+            throws Exception {
+        return new SynchronizedQueue<WriteRequest>(new 
CircularQueue<WriteRequest>(128));
+    }
+
     private static class DefaultIoSessionAttributeMap implements 
IoSessionAttributeMap {
 
         private final Map<Object, Object> attributes =

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/DummySession.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/DummySession.java?rev=592298&r1=592297&r2=592298&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/DummySession.java 
(original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/DummySession.java Mon 
Nov  5 22:20:12 2007
@@ -116,7 +116,9 @@
         };
 
         try {
-            setAttributeMap(new 
DefaultIoSessionAttributeMapFactory().getAttributeMap(this));
+            IoSessionDataStructureFactory factory = new 
DefaultIoSessionDataStructureFactory();
+            setAttributeMap(factory.getAttributeMap(this));
+            setWriteRequestQueue(factory.getWriteRequestQueue(this));
         } catch (Exception e) {
             throw new InternalError();
         }

Modified: mina/trunk/core/src/main/java/org/apache/mina/common/IoService.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/IoService.java?rev=592298&r1=592297&r2=592298&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/IoService.java 
(original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/IoService.java Mon Nov 
 5 22:20:12 2007
@@ -175,14 +175,14 @@
     Set<WriteFuture> broadcast(Object message);
     
     /**
-     * Returns the [EMAIL PROTECTED] IoSessionAttributeMapFactory} that 
provides an
-     * [EMAIL PROTECTED] IoSessionAttributeMap} for a new session created by 
this service.
+     * Returns the [EMAIL PROTECTED] IoSessionDataStructureFactory} that 
provides
+     * related data structures for a new session created by this service.
      */
-    IoSessionAttributeMapFactory getSessionAttributeMapFactory();
+    IoSessionDataStructureFactory getSessionDataStructureFactory();
     
     /**
-     * Sets the [EMAIL PROTECTED] IoSessionAttributeMapFactory} that provides 
an
-     * [EMAIL PROTECTED] IoSessionAttributeMap} for a new session created by 
this service.
+     * Sets the [EMAIL PROTECTED] IoSessionDataStructureFactory} that provides
+     * related data structures for a new session created by this service.
      */
-    void setSessionAttributeMapFactory(IoSessionAttributeMapFactory 
sessionAttributeMapFactory);
+    void setSessionDataStructureFactory(IoSessionDataStructureFactory 
sessionDataStructureFactory);
 }

Copied: 
mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionDataStructureFactory.java
 (from r592267, 
mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionAttributeMapFactory.java)
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionDataStructureFactory.java?p2=mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionDataStructureFactory.java&p1=mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionAttributeMapFactory.java&r1=592267&r2=592298&rev=592298&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionAttributeMapFactory.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/common/IoSessionDataStructureFactory.java
 Mon Nov  5 22:20:12 2007
@@ -19,6 +19,15 @@
  */
 package org.apache.mina.common;
 
-public interface IoSessionAttributeMapFactory {
+import java.util.Queue;
+
+/**
+ * Provides data structures to a newly created session.
+ * 
+ * @author The Apache MINA Project ([EMAIL PROTECTED])
+ * @version $Rev$, $Date$
+ */
+public interface IoSessionDataStructureFactory {
     IoSessionAttributeMap getAttributeMap(IoSession session) throws Exception;
+    Queue<WriteRequest> getWriteRequestQueue(IoSession session) throws 
Exception;
 }


Reply via email to