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;
}