Author: elecharny
Date: Sun Oct 19 09:14:11 2008
New Revision: 706043
URL: http://svn.apache.org/viewvc?rev=706043&view=rev
Log:
o Added comments and javadoc
o unfolded the constructors
o used explicit constants instead of magic numbers
Modified:
mina/trunk/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilter.java
Modified:
mina/trunk/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilter.java
URL:
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilter.java?rev=706043&r1=706042&r2=706043&view=diff
==============================================================================
---
mina/trunk/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilter.java
(original)
+++
mina/trunk/core/src/main/java/org/apache/mina/filter/executor/ExecutorFilter.java
Sun Oct 19 09:14:11 2008
@@ -19,9 +19,6 @@
*/
package org.apache.mina.filter.executor;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
import java.util.EnumSet;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
@@ -114,42 +111,127 @@
* @org.apache.xbean.XBean
*/
public class ExecutorFilter extends IoFilterAdapter {
-
- private final EnumSet<IoEventType> eventTypes;
- private final Executor executor;
- private final boolean createdExecutor;
+ /** The list of handled events */
+ private EnumSet<IoEventType> eventTypes;
+
+ /** The associated executor */
+ private Executor executor;
+
+ /** A flag set if the executor can be managed */
+ private boolean manageableExecutor;
+
+ /** The default pool size */
+ private static final int DEFAULT_MAX_POOL_SIZE = 16;
+
+ /** The number of thread to create at startup */
+ private static final int BASE_THREAD_NUMBER = 0;
+
+ /** The default KeepAlive time, in seconds */
+ private static final long DEFAULT_KEEPALIVE_TIME = 30;
+
+ /**
+ * A set of flags used to tell if the Executor has been created
+ * in the constructor or passed as an argument. In the second case,
+ * the executor state can be managed.
+ **/
+ private static final boolean MANAGEABLE_EXECUTOR = true;
+ private static final boolean NOT_MANAGEABLE_EXECUTOR = false;
+
+ /** A list of default EventTypes to be handled by the executor */
+ private static IoEventType[] DEFAULT_EVENT_SET = new IoEventType[] {
+ IoEventType.EXCEPTION_CAUGHT,
+ IoEventType.MESSAGE_RECEIVED,
+ IoEventType.MESSAGE_SENT,
+ IoEventType.SESSION_CLOSED,
+ IoEventType.SESSION_IDLE,
+ IoEventType.SESSION_OPENED
+ };
+
/**
* (Convenience constructor) Creates a new instance with a new
- * [EMAIL PROTECTED] OrderedThreadPoolExecutor}.
+ * [EMAIL PROTECTED] OrderedThreadPoolExecutor}, no thread in the pool,
and a
+ * maximum of 16 threads in the pool. All the event will be handled
+ * by this default executor.
*/
public ExecutorFilter() {
- this(16, (IoEventType[]) null);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ BASE_THREAD_NUMBER,
+ DEFAULT_MAX_POOL_SIZE,
+ DEFAULT_KEEPALIVE_TIME,
+ TimeUnit.SECONDS,
+ Executors.defaultThreadFactory(),
+ null);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, DEFAULT_EVENT_SET);
}
/**
* (Convenience constructor) Creates a new instance with a new
- * [EMAIL PROTECTED] OrderedThreadPoolExecutor}.
+ * [EMAIL PROTECTED] OrderedThreadPoolExecutor}, no thread in the pool,
but
+ * a maximum of threads in the pool is given. All the event will be
handled
+ * by this default executor.
+ *
+ * @param maximumPoolSize The maximum number of thread the default
executor can
+ * use
*/
public ExecutorFilter(int maximumPoolSize) {
- this(0, maximumPoolSize, (IoEventType[]) null);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ BASE_THREAD_NUMBER,
+ maximumPoolSize,
+ DEFAULT_KEEPALIVE_TIME,
+ TimeUnit.SECONDS,
+ Executors.defaultThreadFactory(),
+ null);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, DEFAULT_EVENT_SET);
}
/**
* (Convenience constructor) Creates a new instance with a new
- * [EMAIL PROTECTED] OrderedThreadPoolExecutor}.
+ * [EMAIL PROTECTED] OrderedThreadPoolExecutor}, a number of thread to
start with, a
+ * maximum of threads the pool can contain. All the event will be handled
+ * by this default executor.
+ *
+ * @param corePoolSize the base number of threads the pool will contain at
startup
+ * @param maximumPoolSize The maximum number of thread the default
executor can
+ * use
*/
public ExecutorFilter(int corePoolSize, int maximumPoolSize) {
- this(corePoolSize, maximumPoolSize, 30, TimeUnit.SECONDS,
(IoEventType[]) null);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ corePoolSize,
+ maximumPoolSize,
+ DEFAULT_KEEPALIVE_TIME,
+ TimeUnit.SECONDS,
+ Executors.defaultThreadFactory(),
+ null);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, DEFAULT_EVENT_SET);
}
/**
* (Convenience constructor) Creates a new instance with a new
* [EMAIL PROTECTED] OrderedThreadPoolExecutor}.
*/
- public ExecutorFilter(
- int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit) {
- this(corePoolSize, maximumPoolSize, keepAliveTime, unit,
(IoEventType[]) null);
+ public ExecutorFilter(int corePoolSize, int maximumPoolSize, long
keepAliveTime,
+ TimeUnit unit) {
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ corePoolSize,
+ maximumPoolSize,
+ keepAliveTime,
+ unit,
+ Executors.defaultThreadFactory(),
+ null);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, DEFAULT_EVENT_SET);
}
/**
@@ -160,7 +242,17 @@
int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
IoEventQueueHandler queueHandler) {
- this(corePoolSize, maximumPoolSize, keepAliveTime, unit,
Executors.defaultThreadFactory(), queueHandler, (IoEventType[]) null);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ corePoolSize,
+ maximumPoolSize,
+ keepAliveTime,
+ unit,
+ Executors.defaultThreadFactory(),
+ queueHandler);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, DEFAULT_EVENT_SET);
}
/**
@@ -171,7 +263,17 @@
int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
ThreadFactory threadFactory) {
- this(corePoolSize, maximumPoolSize, keepAliveTime, unit,
threadFactory, null, (IoEventType[]) null);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ corePoolSize,
+ maximumPoolSize,
+ keepAliveTime,
+ unit,
+ threadFactory,
+ null);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, DEFAULT_EVENT_SET);
}
/**
@@ -182,7 +284,11 @@
int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
ThreadFactory threadFactory, IoEventQueueHandler queueHandler) {
- this(new OrderedThreadPoolExecutor(corePoolSize, maximumPoolSize,
keepAliveTime, unit, threadFactory, queueHandler), true, (IoEventType[]) null);
+ // Create a new default Executor
+ Executor executor = new OrderedThreadPoolExecutor(corePoolSize,
maximumPoolSize, keepAliveTime, unit, threadFactory, queueHandler);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, DEFAULT_EVENT_SET);
}
/**
@@ -190,7 +296,17 @@
* [EMAIL PROTECTED] OrderedThreadPoolExecutor}.
*/
public ExecutorFilter(IoEventType... eventTypes) {
- this(16, eventTypes);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ BASE_THREAD_NUMBER,
+ DEFAULT_MAX_POOL_SIZE,
+ DEFAULT_KEEPALIVE_TIME,
+ TimeUnit.SECONDS,
+ Executors.defaultThreadFactory(),
+ null);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, eventTypes);
}
/**
@@ -198,7 +314,17 @@
* [EMAIL PROTECTED] OrderedThreadPoolExecutor}.
*/
public ExecutorFilter(int maximumPoolSize, IoEventType... eventTypes) {
- this(0, maximumPoolSize, eventTypes);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ BASE_THREAD_NUMBER,
+ maximumPoolSize,
+ DEFAULT_KEEPALIVE_TIME,
+ TimeUnit.SECONDS,
+ Executors.defaultThreadFactory(),
+ null);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, eventTypes);
}
/**
@@ -206,7 +332,17 @@
* [EMAIL PROTECTED] OrderedThreadPoolExecutor}.
*/
public ExecutorFilter(int corePoolSize, int maximumPoolSize,
IoEventType... eventTypes) {
- this(corePoolSize, maximumPoolSize, 30, TimeUnit.SECONDS, eventTypes);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ corePoolSize,
+ maximumPoolSize,
+ DEFAULT_KEEPALIVE_TIME,
+ TimeUnit.SECONDS,
+ Executors.defaultThreadFactory(),
+ null);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, eventTypes);
}
/**
@@ -215,7 +351,17 @@
*/
public ExecutorFilter(
int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, IoEventType... eventTypes) {
- this(corePoolSize, maximumPoolSize, keepAliveTime, unit,
Executors.defaultThreadFactory(), eventTypes);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ corePoolSize,
+ maximumPoolSize,
+ keepAliveTime,
+ unit,
+ Executors.defaultThreadFactory(),
+ null);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, eventTypes);
}
/**
@@ -226,7 +372,17 @@
int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
IoEventQueueHandler queueHandler, IoEventType... eventTypes) {
- this(corePoolSize, maximumPoolSize, keepAliveTime, unit,
Executors.defaultThreadFactory(), queueHandler, eventTypes);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ corePoolSize,
+ maximumPoolSize,
+ keepAliveTime,
+ unit,
+ Executors.defaultThreadFactory(),
+ queueHandler);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, eventTypes);
}
/**
@@ -237,74 +393,136 @@
int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
ThreadFactory threadFactory, IoEventType... eventTypes) {
- this(corePoolSize, maximumPoolSize, keepAliveTime, unit,
threadFactory, null, eventTypes);
+ // Create a new default Executor
+ Executor executor = createDefaultExecutor(
+ corePoolSize,
+ maximumPoolSize,
+ keepAliveTime,
+ unit,
+ threadFactory,
+ null);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, eventTypes);
}
/**
* (Convenience constructor) Creates a new instance with a new
* [EMAIL PROTECTED] OrderedThreadPoolExecutor}.
+ *
+ * @param corePoolSize The base number of thread in the pool
+ * @param maximumPoolSize The macimum thread contained in the executor
+ * @param keepAliveTime The KeepAlive timeout, expressed using the time
unit
+ * @param unit The time unit
+ * @param threadFactory
+ * @param queueHandler
+ * @param eventTypes The list of events handled by the created executor
*/
public ExecutorFilter(
int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
- ThreadFactory threadFactory, IoEventQueueHandler queueHandler,
IoEventType... eventTypes) {
- this(new OrderedThreadPoolExecutor(corePoolSize, maximumPoolSize,
keepAliveTime, unit, threadFactory, queueHandler), true, eventTypes);
+ ThreadFactory threadFactory, IoEventQueueHandler queueHandler,
+ IoEventType... eventTypes) {
+ // Create a new default Executor
+ Executor executor = new OrderedThreadPoolExecutor(corePoolSize,
maximumPoolSize,
+ keepAliveTime, unit, threadFactory, queueHandler);
+
+ // Initialize the filter
+ init(executor, MANAGEABLE_EXECUTOR, eventTypes);
}
/**
* Creates a new instance with the specified [EMAIL PROTECTED] Executor}.
*/
public ExecutorFilter(Executor executor) {
- this(executor, false, (IoEventType[]) null);
+ // Initialize the filter
+ init(executor, NOT_MANAGEABLE_EXECUTOR, DEFAULT_EVENT_SET);
}
/**
* Creates a new instance with the specified [EMAIL PROTECTED] Executor}.
*/
public ExecutorFilter(Executor executor, IoEventType... eventTypes) {
- this(executor, false, eventTypes);
+ // Initialize the filter
+ init(executor, NOT_MANAGEABLE_EXECUTOR, eventTypes);
}
-
- private ExecutorFilter(Executor executor, boolean createdExecutor,
IoEventType... eventTypes) {
- if (executor == null) {
- throw new NullPointerException("executor");
- }
+
+ /**
+ * Create an OrderedThreadPool executor.
+ *
+ * @param corePoolSize
+ * @param maximumPoolSize
+ * @param keepAliveTime
+ * @param unit
+ * @param threadFactory
+ * @param queueHandler
+ * @return
+ */
+ private Executor createDefaultExecutor(int corePoolSize, int
maximumPoolSize, long keepAliveTime,
+ TimeUnit unit, ThreadFactory threadFactory, IoEventQueueHandler
queueHandler) {
+ // Create a new Executor
+ Executor executor = new OrderedThreadPoolExecutor(corePoolSize,
maximumPoolSize,
+ keepAliveTime, unit, threadFactory, queueHandler);
+
+ return executor;
+ }
+
+ /**
+ * Create an EnumSet from an array of EventTypes, and set the associated
+ * eventTypes field.
+ *
+ * @param eventTypes The array of handled events
+ */
+ private void initEventTypes(IoEventType... eventTypes) {
if (eventTypes == null || eventTypes.length == 0) {
- eventTypes = new IoEventType[] { IoEventType.EXCEPTION_CAUGHT,
- IoEventType.MESSAGE_RECEIVED, IoEventType.MESSAGE_SENT,
- IoEventType.SESSION_CLOSED, IoEventType.SESSION_IDLE,
- IoEventType.SESSION_OPENED, };
+ eventTypes = DEFAULT_EVENT_SET;
}
- for (IoEventType t : eventTypes) {
- if (t == IoEventType.SESSION_CREATED) {
- throw new IllegalArgumentException(IoEventType.SESSION_CREATED
- + " is not allowed.");
- }
+ // Copy the list of handled events in the event set
+ this.eventTypes = EnumSet.of(eventTypes[0], eventTypes);
+
+ // Check that we don't have the SESSION_CREATED event in the set
+ if (this.eventTypes.contains( IoEventType.SESSION_CREATED )) {
+ this.eventTypes = null;
+ throw new IllegalArgumentException(IoEventType.SESSION_CREATED
+ + " is not allowed.");
}
+ }
- this.executor = executor;
- this.createdExecutor = createdExecutor;
+ /**
+ * Creates a new instance of ExecutorFilter. This private constructor is
called by all
+ * the public constructor.
+ *
+ * @param executor The underlying [EMAIL PROTECTED] Executor} in charge of
managing the Thread pool.
+ * @param manageableExecutor Tells if the Executor's Life Cycle can be
managed or not
+ * @param eventTypes The lit of event which are handled by the executor
+ * @param
+ */
+ private void init(Executor executor, boolean manageableExecutor,
IoEventType... eventTypes) {
+ if (executor == null) {
+ throw new NullPointerException("executor");
+ }
- Collection<IoEventType> eventTypeCollection = new
ArrayList<IoEventType>(
- eventTypes.length);
- Collections.addAll(eventTypeCollection, eventTypes);
- this.eventTypes = EnumSet.copyOf(eventTypeCollection);
+ initEventTypes(eventTypes);
+ this.executor = executor;
+ this.manageableExecutor = manageableExecutor;
}
/**
- * Shuts down the underlying executor if this filter is creates via
+ * Shuts down the underlying executor if this filter hase been created via
* a convenience constructor.
*/
@Override
public void destroy() {
- if (createdExecutor) {
+ if (manageableExecutor) {
((ExecutorService) executor).shutdown();
}
}
/**
* Returns the underlying [EMAIL PROTECTED] Executor} instance this filter
uses.
+ *
+ * @return The underlying [EMAIL PROTECTED] Executor}
*/
public final Executor getExecutor() {
return executor;
@@ -317,6 +535,17 @@
getExecutor().execute(event);
}
+ /**
+ * A trigger fired when adding this filter in a chain. As this filter can
be
+ * added only once in a chain, if the chain already contains the same
filter,
+ * and exception will be thrown.
+ *
+ * @param parent The chain in which we want to inject this filter
+ * @param name The Fitler's name
+ * @param nextFilter The next filter in the chain
+ *
+ * @throws IllegalArgumentException If the filter is already present in
the chain
+ */
@Override
public void onPreAdd(IoFilterChain parent, String name,
NextFilter nextFilter) throws Exception {
@@ -327,11 +556,6 @@
}
@Override
- public final void sessionCreated(NextFilter nextFilter, IoSession session)
{
- nextFilter.sessionCreated(session);
- }
-
- @Override
public final void sessionOpened(NextFilter nextFilter, IoSession session) {
if (eventTypes.contains(IoEventType.SESSION_OPENED)) {
fireEvent(new IoFilterEvent(nextFilter, IoEventType.SESSION_OPENED,