Author: oheger Date: Sat Nov 7 16:37:05 2009 New Revision: 833709 URL: http://svn.apache.org/viewvc?rev=833709&view=rev Log: [LANG-545] Added ability to create a ConstantFuture object. Thanks to Stephen Colebourne for the patch.
Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/concurrent/ConcurrentUtils.java commons/proper/lang/trunk/src/test/org/apache/commons/lang/concurrent/ConcurrentUtilsTest.java Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/concurrent/ConcurrentUtils.java URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/concurrent/ConcurrentUtils.java?rev=833709&r1=833708&r2=833709&view=diff ============================================================================== --- commons/proper/lang/trunk/src/java/org/apache/commons/lang/concurrent/ConcurrentUtils.java (original) +++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/concurrent/ConcurrentUtils.java Sat Nov 7 16:37:05 2009 @@ -17,6 +17,8 @@ package org.apache.commons.lang.concurrent; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; /** * <p> @@ -28,6 +30,7 @@ * @version $Id$ */ public class ConcurrentUtils { + /** * Private constructor so that no instances can be created. This class * contains only static utility methods. @@ -117,4 +120,53 @@ throw (Error) ex.getCause(); } } + + //----------------------------------------------------------------------- + /** + * <p> + * Gets an implementation of <code>Future</code> that is immediately done + * and returns the specified constant value. + * </p> + * <p> + * This can be useful to return a simple constant immediately from the + * concurrent processing, perhaps as part of avoiding nulls. + * A constant future can also be useful in testing. + * </p> + * + * @param value the constant value to return, may be null + * @return an instance of Future that will return the value, never null + */ + public static <T> Future<T> constantFuture(T value) { + return new ConstantFuture<T>(value); + } + + static final class ConstantFuture<T> implements Future<T> { + /** The constant value. */ + private final T value; + + ConstantFuture(T value) { + this.value = value; + } + + public boolean isDone() { + return true; + } + + public T get() { + return value; + } + + public T get(long timeout, TimeUnit unit) { + return value; + } + + public boolean isCancelled() { + return false; + } + + public boolean cancel(boolean mayInterruptIfRunning) { + return false; + } + } + } Modified: commons/proper/lang/trunk/src/test/org/apache/commons/lang/concurrent/ConcurrentUtilsTest.java URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/org/apache/commons/lang/concurrent/ConcurrentUtilsTest.java?rev=833709&r1=833708&r2=833709&view=diff ============================================================================== --- commons/proper/lang/trunk/src/test/org/apache/commons/lang/concurrent/ConcurrentUtilsTest.java (original) +++ commons/proper/lang/trunk/src/test/org/apache/commons/lang/concurrent/ConcurrentUtilsTest.java Sat Nov 7 16:37:05 2009 @@ -17,6 +17,8 @@ package org.apache.commons.lang.concurrent; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import junit.framework.TestCase; @@ -161,4 +163,36 @@ ConcurrentUtils.handleCause(null); ConcurrentUtils.handleCause(new ExecutionException("Test", null)); } + + //----------------------------------------------------------------------- + /** + * Tests constant future. + */ + public void testConstantFuture_Integer() throws Exception { + Integer value = new Integer(5); + Future<Integer> test = ConcurrentUtils.constantFuture(value); + assertEquals(true, test.isDone()); + assertSame(value, test.get()); + assertSame(value, test.get(1000, TimeUnit.SECONDS)); + assertSame(value, test.get(1000, null)); + assertEquals(false, test.isCancelled()); + assertEquals(false, test.cancel(true)); + assertEquals(false, test.cancel(false)); + } + + /** + * Tests constant future. + */ + public void testConstantFuture_null() throws Exception { + Integer value = null; + Future<Integer> test = ConcurrentUtils.constantFuture(value); + assertEquals(true, test.isDone()); + assertSame(value, test.get()); + assertSame(value, test.get(1000, TimeUnit.SECONDS)); + assertSame(value, test.get(1000, null)); + assertEquals(false, test.isCancelled()); + assertEquals(false, test.cancel(true)); + assertEquals(false, test.cancel(false)); + } + }