From ea7503414ef384fe2b09759d58f30cac89f1de26 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Wed, 20 Jul 2016 19:58:20 +0530 Subject: [PATCH 01/12] Work on #403, added basic implementation of promise pattern --- promise/pom.xml | 47 +++++ .../main/java/com/iluwatar/promise/App.java | 24 +++ .../promise/ListenableAsyncResult.java | 12 ++ .../promise/PromiseAsyncExecutor.java | 7 + .../iluwatar/promise/ThreadAsyncExecutor.java | 173 ++++++++++++++++++ 5 files changed, 263 insertions(+) create mode 100644 promise/pom.xml create mode 100644 promise/src/main/java/com/iluwatar/promise/App.java create mode 100644 promise/src/main/java/com/iluwatar/promise/ListenableAsyncResult.java create mode 100644 promise/src/main/java/com/iluwatar/promise/PromiseAsyncExecutor.java create mode 100644 promise/src/main/java/com/iluwatar/promise/ThreadAsyncExecutor.java diff --git a/promise/pom.xml b/promise/pom.xml new file mode 100644 index 000000000..ca12515ee --- /dev/null +++ b/promise/pom.xml @@ -0,0 +1,47 @@ + + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.13.0-SNAPSHOT + + promise + + + junit + junit + test + + + org.mockito + mockito-core + test + + + diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java new file mode 100644 index 000000000..dc22c307a --- /dev/null +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -0,0 +1,24 @@ +package com.iluwatar.promise; + +public class App { + + /** + * Program entry point + * @param args arguments + */ + public static void main(String[] args) { + ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); + executor.execute(() -> { + Thread.sleep(1000); + return 10; + }).then(value -> {System.out.println("Consumed the value: " + value);}) + .then(nullVal -> {System.out.println("Post consuming value");}); + + + executor.execute(() -> { + Thread.sleep(1000); + return "10"; + }).then(value -> {return 10 + Integer.parseInt(value);}) + .then(intValue -> {System.out.println("Consumed int value: " + intValue);}); + } +} diff --git a/promise/src/main/java/com/iluwatar/promise/ListenableAsyncResult.java b/promise/src/main/java/com/iluwatar/promise/ListenableAsyncResult.java new file mode 100644 index 000000000..a68154e17 --- /dev/null +++ b/promise/src/main/java/com/iluwatar/promise/ListenableAsyncResult.java @@ -0,0 +1,12 @@ +package com.iluwatar.promise; + +import java.util.function.Consumer; +import java.util.function.Function; + +import com.iluwatar.async.method.invocation.AsyncResult; + +public interface ListenableAsyncResult extends AsyncResult { + ListenableAsyncResult then(Consumer action); + ListenableAsyncResult then(Function func); + ListenableAsyncResult error(Consumer action); +} diff --git a/promise/src/main/java/com/iluwatar/promise/PromiseAsyncExecutor.java b/promise/src/main/java/com/iluwatar/promise/PromiseAsyncExecutor.java new file mode 100644 index 000000000..eb43b0546 --- /dev/null +++ b/promise/src/main/java/com/iluwatar/promise/PromiseAsyncExecutor.java @@ -0,0 +1,7 @@ +package com.iluwatar.promise; + +import java.util.concurrent.Callable; + +public interface PromiseAsyncExecutor { + ListenableAsyncResult execute(Callable task); +} diff --git a/promise/src/main/java/com/iluwatar/promise/ThreadAsyncExecutor.java b/promise/src/main/java/com/iluwatar/promise/ThreadAsyncExecutor.java new file mode 100644 index 000000000..aa057d676 --- /dev/null +++ b/promise/src/main/java/com/iluwatar/promise/ThreadAsyncExecutor.java @@ -0,0 +1,173 @@ +package com.iluwatar.promise; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.function.Function; + +public class ThreadAsyncExecutor implements PromiseAsyncExecutor { + + /** Index for thread naming */ + private final AtomicInteger idx = new AtomicInteger(0); + + @Override + public ListenableAsyncResult execute(Callable task) { + Promise promise = new Promise<>(); + new Thread(() -> { + try { + promise.setValue(task.call()); + promise.postComplete(); + } catch (Exception ex) { + promise.setException(ex); + } + } , "executor-" + idx.incrementAndGet()).start(); + return promise; + } + + // TODO there is scope of extending the completable future from async method invocation project. Do that. + private class Promise implements ListenableAsyncResult { + + static final int RUNNING = 1; + static final int FAILED = 2; + static final int COMPLETED = 3; + + final Object lock; + volatile int state = RUNNING; + T value; + Exception exception; + Runnable fulfilmentAction; + + public Promise() { + this.lock = new Object(); + } + + void postComplete() { + fulfilmentAction.run(); + } + + /** + * Sets the value from successful execution and executes callback if available. Notifies any thread waiting for + * completion. + * + * @param value + * value of the evaluated task + */ + public void setValue(T value) { + this.value = value; + this.state = COMPLETED; + synchronized (lock) { + lock.notifyAll(); + } + } + + /** + * Sets the exception from failed execution and executes callback if available. Notifies any thread waiting for + * completion. + * + * @param exception + * exception of the failed task + */ + public void setException(Exception exception) { + this.exception = exception; + this.state = FAILED; + synchronized (lock) { + lock.notifyAll(); + } + } + + @Override + public boolean isCompleted() { + return state > RUNNING; + } + + @Override + public T getValue() throws ExecutionException { + if (state == COMPLETED) { + return value; + } else if (state == FAILED) { + throw new ExecutionException(exception); + } else { + throw new IllegalStateException("Execution not completed yet"); + } + } + + @Override + public void await() throws InterruptedException { + synchronized (lock) { + if (!isCompleted()) { + lock.wait(); + } + } + } + + @Override + public ListenableAsyncResult then(Consumer action) { + Promise dest = new Promise<>(); + fulfilmentAction = new ConsumeAction(this, dest, action); + return dest; + } + + @Override + public ListenableAsyncResult then(Function func) { + Promise dest = new Promise<>(); + fulfilmentAction = new FunctionAction(this, dest, func); + return dest; + } + + @Override + public ListenableAsyncResult error(Consumer action) { + return null; + } + + private class ConsumeAction implements Runnable { + + private Promise current; + private Promise dest; + private Consumer action; + + public ConsumeAction(Promise current, Promise dest, Consumer action) { + this.current = current; + this.dest = dest; + this.action = action; + } + + @Override + public void run() { + try { + action.accept(current.getValue()); + dest.setValue(null); + } catch (ExecutionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + dest.postComplete(); + } + } + + private class FunctionAction implements Runnable { + + private Promise current; + private Promise dest; + private Function func; + + public FunctionAction(Promise current, Promise dest, Function func) { + this.current = current; + this.dest = dest; + this.func = func; + } + + @Override + public void run() { + try { + V result = func.apply(current.getValue()); + dest.setValue(result); + } catch (ExecutionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + dest.postComplete(); + } + } + } + } \ No newline at end of file From 102341443d33b7cca89f4e37b7c2e490fe780584 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Thu, 21 Jul 2016 19:13:42 +0530 Subject: [PATCH 02/12] Work on #403, added application class and test cases. --- pom.xml | 1 + promise/pom.xml | 5 + .../main/java/com/iluwatar/promise/App.java | 30 ++- .../promise/ListenableAsyncResult.java | 12 -- .../java/com/iluwatar/promise/Promise.java | 143 +++++++++++++++ .../promise/PromiseAsyncExecutor.java | 7 - .../iluwatar/promise/ThreadAsyncExecutor.java | 173 ------------------ .../java/com/iluwatar/promise/AppTest.java | 15 ++ .../com/iluwatar/promise/PromiseTest.java | 128 +++++++++++++ 9 files changed, 314 insertions(+), 200 deletions(-) delete mode 100644 promise/src/main/java/com/iluwatar/promise/ListenableAsyncResult.java create mode 100644 promise/src/main/java/com/iluwatar/promise/Promise.java delete mode 100644 promise/src/main/java/com/iluwatar/promise/PromiseAsyncExecutor.java delete mode 100644 promise/src/main/java/com/iluwatar/promise/ThreadAsyncExecutor.java create mode 100644 promise/src/test/java/com/iluwatar/promise/AppTest.java create mode 100644 promise/src/test/java/com/iluwatar/promise/PromiseTest.java diff --git a/pom.xml b/pom.xml index 6f3e0d698..45d574e73 100644 --- a/pom.xml +++ b/pom.xml @@ -128,6 +128,7 @@ hexagonal abstract-document aggregator-microservices + promise page-object diff --git a/promise/pom.xml b/promise/pom.xml index ca12515ee..f5727b951 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -43,5 +43,10 @@ mockito-core test + + com.iluwatar + async-method-invocation + 1.13.0-SNAPSHOT + diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java index dc22c307a..5817e68da 100644 --- a/promise/src/main/java/com/iluwatar/promise/App.java +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -1,24 +1,38 @@ package com.iluwatar.promise; +import com.iluwatar.async.method.invocation.ThreadAsyncExecutor; + +/** + * + * Application that uses promise pattern. + */ public class App { /** * Program entry point * @param args arguments + * @throws InterruptedException if main thread is interruped. */ - public static void main(String[] args) { + public static void main(String[] args) throws InterruptedException { ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); - executor.execute(() -> { + + Promise consumedPromise = new Promise<>(); + consumedPromise.fulfillInAsync(() -> { Thread.sleep(1000); return 10; - }).then(value -> {System.out.println("Consumed the value: " + value);}) - .then(nullVal -> {System.out.println("Post consuming value");}); + }, executor).then(value -> { + System.out.println("Consumed int value: " + value); + }); - - executor.execute(() -> { + Promise transformedPromise = new Promise<>(); + transformedPromise.fulfillInAsync(() -> { Thread.sleep(1000); return "10"; - }).then(value -> {return 10 + Integer.parseInt(value);}) - .then(intValue -> {System.out.println("Consumed int value: " + intValue);}); + }, executor).then(value -> { return Integer.parseInt(value); }).then(value -> { + System.out.println(value); + }); + + consumedPromise.await(); + transformedPromise.await(); } } diff --git a/promise/src/main/java/com/iluwatar/promise/ListenableAsyncResult.java b/promise/src/main/java/com/iluwatar/promise/ListenableAsyncResult.java deleted file mode 100644 index a68154e17..000000000 --- a/promise/src/main/java/com/iluwatar/promise/ListenableAsyncResult.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iluwatar.promise; - -import java.util.function.Consumer; -import java.util.function.Function; - -import com.iluwatar.async.method.invocation.AsyncResult; - -public interface ListenableAsyncResult extends AsyncResult { - ListenableAsyncResult then(Consumer action); - ListenableAsyncResult then(Function func); - ListenableAsyncResult error(Consumer action); -} diff --git a/promise/src/main/java/com/iluwatar/promise/Promise.java b/promise/src/main/java/com/iluwatar/promise/Promise.java new file mode 100644 index 000000000..0bc4accbb --- /dev/null +++ b/promise/src/main/java/com/iluwatar/promise/Promise.java @@ -0,0 +1,143 @@ +package com.iluwatar.promise; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.iluwatar.async.method.invocation.AsyncExecutor; +import com.iluwatar.async.method.invocation.internal.CompletableResult; + +/** + * Implements the promise pattern. + * @param type of result. + */ +public class Promise extends CompletableResult { + + private Runnable fulfillmentAction; + + /** + * Creates a promise that will be fulfilled in future. + */ + public Promise() { + super(null); + } + + /** + * Fulfills the promise with the provided value. + * @param value the fulfilled value that can be accessed using {@link #getValue()}. + */ + @Override + public void setValue(T value) { + super.setValue(value); + postComplete(); + } + + /** + * Fulfills the promise with exception due to error in execution. + * @param exception the exception will be wrapped in {@link ExecutionException} + * when accessing the value using {@link #getValue()}. + */ + @Override + public void setException(Exception exception) { + super.setException(exception); + postComplete(); + } + + void postComplete() { + if (fulfillmentAction == null) { + return; + } + fulfillmentAction.run(); + } + + /** + * Executes the task using the executor in other thread and fulfills the promise returned + * once the task completes either successfully or with an exception. + * + * @param task the task that will provide the value to fulfill the promise. + * @param executor the executor in which the task should be run. + * @return a promise that represents the result of running the task provided. + */ + public Promise fulfillInAsync(final Callable task, AsyncExecutor executor) { + executor.startProcess(new Callable() { + + @Override + public Void call() throws Exception { + setValue(task.call()); + return null; + } + }); + return this; + } + + /** + * Returns a new promise that, when this promise is fulfilled normally, is fulfilled with + * result of this promise as argument to the action provided. + * @param action action to be executed. + * @return a new promise. + */ + public Promise then(Consumer action) { + Promise dest = new Promise<>(); + fulfillmentAction = new ConsumeAction(this, dest, action); + return dest; + } + + /** + * Returns a new promise that, when this promise is fulfilled normally, is fulfilled with + * result of this promise as argument to the function provided. + * @param func function to be executed. + * @return a new promise. + */ + public Promise then(Function func) { + Promise dest = new Promise<>(); + fulfillmentAction = new FunctionAction(this, dest, func); + return dest; + } + + private class ConsumeAction implements Runnable { + + private Promise current; + private Promise dest; + private Consumer action; + + public ConsumeAction(Promise current, Promise dest, Consumer action) { + this.current = current; + this.dest = dest; + this.action = action; + } + + @Override + public void run() { + try { + action.accept(current.getValue()); + dest.setValue(null); + } catch (Throwable e) { + dest.setException((Exception) e.getCause()); + } + } + } + + private class FunctionAction implements Runnable { + + private Promise current; + private Promise dest; + private Function func; + + public FunctionAction(Promise current, Promise dest, Function func) { + this.current = current; + this.dest = dest; + this.func = func; + } + + @Override + public void run() { + try { + V result = func.apply(current.getValue()); + dest.setValue(result); + } catch (Throwable e) { + dest.setException((Exception) e.getCause()); + } + } + } +} diff --git a/promise/src/main/java/com/iluwatar/promise/PromiseAsyncExecutor.java b/promise/src/main/java/com/iluwatar/promise/PromiseAsyncExecutor.java deleted file mode 100644 index eb43b0546..000000000 --- a/promise/src/main/java/com/iluwatar/promise/PromiseAsyncExecutor.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iluwatar.promise; - -import java.util.concurrent.Callable; - -public interface PromiseAsyncExecutor { - ListenableAsyncResult execute(Callable task); -} diff --git a/promise/src/main/java/com/iluwatar/promise/ThreadAsyncExecutor.java b/promise/src/main/java/com/iluwatar/promise/ThreadAsyncExecutor.java deleted file mode 100644 index aa057d676..000000000 --- a/promise/src/main/java/com/iluwatar/promise/ThreadAsyncExecutor.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.iluwatar.promise; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; -import java.util.function.Function; - -public class ThreadAsyncExecutor implements PromiseAsyncExecutor { - - /** Index for thread naming */ - private final AtomicInteger idx = new AtomicInteger(0); - - @Override - public ListenableAsyncResult execute(Callable task) { - Promise promise = new Promise<>(); - new Thread(() -> { - try { - promise.setValue(task.call()); - promise.postComplete(); - } catch (Exception ex) { - promise.setException(ex); - } - } , "executor-" + idx.incrementAndGet()).start(); - return promise; - } - - // TODO there is scope of extending the completable future from async method invocation project. Do that. - private class Promise implements ListenableAsyncResult { - - static final int RUNNING = 1; - static final int FAILED = 2; - static final int COMPLETED = 3; - - final Object lock; - volatile int state = RUNNING; - T value; - Exception exception; - Runnable fulfilmentAction; - - public Promise() { - this.lock = new Object(); - } - - void postComplete() { - fulfilmentAction.run(); - } - - /** - * Sets the value from successful execution and executes callback if available. Notifies any thread waiting for - * completion. - * - * @param value - * value of the evaluated task - */ - public void setValue(T value) { - this.value = value; - this.state = COMPLETED; - synchronized (lock) { - lock.notifyAll(); - } - } - - /** - * Sets the exception from failed execution and executes callback if available. Notifies any thread waiting for - * completion. - * - * @param exception - * exception of the failed task - */ - public void setException(Exception exception) { - this.exception = exception; - this.state = FAILED; - synchronized (lock) { - lock.notifyAll(); - } - } - - @Override - public boolean isCompleted() { - return state > RUNNING; - } - - @Override - public T getValue() throws ExecutionException { - if (state == COMPLETED) { - return value; - } else if (state == FAILED) { - throw new ExecutionException(exception); - } else { - throw new IllegalStateException("Execution not completed yet"); - } - } - - @Override - public void await() throws InterruptedException { - synchronized (lock) { - if (!isCompleted()) { - lock.wait(); - } - } - } - - @Override - public ListenableAsyncResult then(Consumer action) { - Promise dest = new Promise<>(); - fulfilmentAction = new ConsumeAction(this, dest, action); - return dest; - } - - @Override - public ListenableAsyncResult then(Function func) { - Promise dest = new Promise<>(); - fulfilmentAction = new FunctionAction(this, dest, func); - return dest; - } - - @Override - public ListenableAsyncResult error(Consumer action) { - return null; - } - - private class ConsumeAction implements Runnable { - - private Promise current; - private Promise dest; - private Consumer action; - - public ConsumeAction(Promise current, Promise dest, Consumer action) { - this.current = current; - this.dest = dest; - this.action = action; - } - - @Override - public void run() { - try { - action.accept(current.getValue()); - dest.setValue(null); - } catch (ExecutionException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - dest.postComplete(); - } - } - - private class FunctionAction implements Runnable { - - private Promise current; - private Promise dest; - private Function func; - - public FunctionAction(Promise current, Promise dest, Function func) { - this.current = current; - this.dest = dest; - this.func = func; - } - - @Override - public void run() { - try { - V result = func.apply(current.getValue()); - dest.setValue(result); - } catch (ExecutionException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - dest.postComplete(); - } - } - } - } \ No newline at end of file diff --git a/promise/src/test/java/com/iluwatar/promise/AppTest.java b/promise/src/test/java/com/iluwatar/promise/AppTest.java new file mode 100644 index 000000000..b59187cb1 --- /dev/null +++ b/promise/src/test/java/com/iluwatar/promise/AppTest.java @@ -0,0 +1,15 @@ +package com.iluwatar.promise; + +import org.junit.Test; + +/** + * + * Application test. + */ +public class AppTest { + + @Test + public void testApp() throws InterruptedException { + App.main(null); + } +} diff --git a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java new file mode 100644 index 000000000..9c28be1b3 --- /dev/null +++ b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java @@ -0,0 +1,128 @@ +package com.iluwatar.promise; + +import static org.junit.Assert.assertEquals; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import com.iluwatar.async.method.invocation.ThreadAsyncExecutor; + +/** + * Tests Promise class. + */ +public class PromiseTest { + + private ThreadAsyncExecutor executor; + private Promise promise; + @Rule public ExpectedException exception = ExpectedException.none(); + + @Before + public void setUp() { + executor = new ThreadAsyncExecutor(); + promise = new Promise<>(); + } + + @Test + public void promiseIsFulfilledWithTheResultantValueOfExecutingTheTask() + throws InterruptedException, ExecutionException { + promise.fulfillInAsync(new NumberCrunchingTask(), executor); + + // await fulfillment + promise.await(); + + assertEquals(NumberCrunchingTask.CRUNCHED_NUMBER, promise.getValue()); + } + + @Test + public void dependentPromiseIsFulfilledAfterTheConsumerConsumesTheResultOfThisPromise() + throws InterruptedException, ExecutionException { + Promise dependentPromise = promise + .fulfillInAsync(new NumberCrunchingTask(), executor) + .then(value -> { + assertEquals(NumberCrunchingTask.CRUNCHED_NUMBER, value); + }); + + + // await fulfillment + dependentPromise.await(); + } + + @Test + public void dependentPromiseIsFulfilledWithAnExceptionIfConsumerThrowsAnException() + throws InterruptedException, ExecutionException { + Promise dependentPromise = promise + .fulfillInAsync(new NumberCrunchingTask(), executor) + .then(new Consumer() { + + @Override + public void accept(Integer t) { + throw new RuntimeException("Barf!"); + } + }); + + + // await fulfillment + dependentPromise.await(); + + exception.expect(ExecutionException.class); + + dependentPromise.getValue(); + } + + @Test + public void dependentPromiseIsFulfilledAfterTheFunctionTransformsTheResultOfThisPromise() + throws InterruptedException, ExecutionException { + Promise dependentPromise = promise + .fulfillInAsync(new NumberCrunchingTask(), executor) + .then(value -> { + assertEquals(NumberCrunchingTask.CRUNCHED_NUMBER, value); + return String.valueOf(value); + }); + + + // await fulfillment + dependentPromise.await(); + + assertEquals(String.valueOf(NumberCrunchingTask.CRUNCHED_NUMBER), dependentPromise.getValue()); + } + + @Test + public void dependentPromiseIsFulfilledWithAnExceptionIfTheFunctionThrowsException() + throws InterruptedException, ExecutionException { + Promise dependentPromise = promise + .fulfillInAsync(new NumberCrunchingTask(), executor) + .then(new Function() { + + @Override + public String apply(Integer t) { + throw new RuntimeException("Barf!"); + } + }); + + // await fulfillment + dependentPromise.await(); + + exception.expect(ExecutionException.class); + + dependentPromise.getValue(); + } + + private static class NumberCrunchingTask implements Callable { + + private static final Integer CRUNCHED_NUMBER = Integer.MAX_VALUE; + + @Override + public Integer call() throws Exception { + // Do number crunching + Thread.sleep(1000); + return CRUNCHED_NUMBER; + } + } +} From 2b945ca27f991d03a5ffd58d4faa809d1aa8df23 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Fri, 22 Jul 2016 16:47:52 +0530 Subject: [PATCH 03/12] Work on #403, removed dependency on async method invocation module, added more tests --- promise/pom.xml | 5 - .../main/java/com/iluwatar/promise/App.java | 26 ++- .../java/com/iluwatar/promise/Promise.java | 169 ++++++++++++++---- .../java/com/iluwatar/promise/AppTest.java | 4 +- .../com/iluwatar/promise/PromiseTest.java | 147 ++++++++++++--- 5 files changed, 275 insertions(+), 76 deletions(-) diff --git a/promise/pom.xml b/promise/pom.xml index f5727b951..ca12515ee 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -43,10 +43,5 @@ mockito-core test - - com.iluwatar - async-method-invocation - 1.13.0-SNAPSHOT - diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java index 5817e68da..f9e089f3d 100644 --- a/promise/src/main/java/com/iluwatar/promise/App.java +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -1,6 +1,9 @@ package com.iluwatar.promise; -import com.iluwatar.async.method.invocation.ThreadAsyncExecutor; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * @@ -12,10 +15,19 @@ public class App { * Program entry point * @param args arguments * @throws InterruptedException if main thread is interruped. + * @throws ExecutionException */ - public static void main(String[] args) throws InterruptedException { - ThreadAsyncExecutor executor = new ThreadAsyncExecutor(); - + public static void main(String[] args) throws InterruptedException, ExecutionException { + ExecutorService executor = Executors.newSingleThreadExecutor(); + try { + promiseUsage(executor); + } finally { + executor.shutdownNow(); + } + } + + private static void promiseUsage(Executor executor) + throws InterruptedException, ExecutionException { Promise consumedPromise = new Promise<>(); consumedPromise.fulfillInAsync(() -> { Thread.sleep(1000); @@ -29,10 +41,10 @@ public class App { Thread.sleep(1000); return "10"; }, executor).then(value -> { return Integer.parseInt(value); }).then(value -> { - System.out.println(value); + System.out.println("Consumed transformed int value: " + value); }); - consumedPromise.await(); - transformedPromise.await(); + consumedPromise.get(); + transformedPromise.get(); } } diff --git a/promise/src/main/java/com/iluwatar/promise/Promise.java b/promise/src/main/java/com/iluwatar/promise/Promise.java index 0bc4accbb..991c2a05c 100644 --- a/promise/src/main/java/com/iluwatar/promise/Promise.java +++ b/promise/src/main/java/com/iluwatar/promise/Promise.java @@ -2,17 +2,18 @@ package com.iluwatar.promise; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import java.util.function.Function; -import com.iluwatar.async.method.invocation.AsyncExecutor; -import com.iluwatar.async.method.invocation.internal.CompletableResult; - /** * Implements the promise pattern. * @param type of result. */ -public class Promise extends CompletableResult { +public class Promise extends PromiseSupport { private Runnable fulfillmentAction; @@ -20,31 +21,30 @@ public class Promise extends CompletableResult { * Creates a promise that will be fulfilled in future. */ public Promise() { - super(null); } /** * Fulfills the promise with the provided value. - * @param value the fulfilled value that can be accessed using {@link #getValue()}. + * @param value the fulfilled value that can be accessed using {@link #get()}. */ @Override - public void setValue(T value) { - super.setValue(value); - postComplete(); + public void fulfill(T value) { + super.fulfill(value); + postFulfillment(); } /** * Fulfills the promise with exception due to error in execution. * @param exception the exception will be wrapped in {@link ExecutionException} - * when accessing the value using {@link #getValue()}. + * when accessing the value using {@link #get()}. */ @Override - public void setException(Exception exception) { - super.setException(exception); - postComplete(); + public void fulfillExceptionally(Exception exception) { + super.fulfillExceptionally(exception); + postFulfillment(); } - void postComplete() { + void postFulfillment() { if (fulfillmentAction == null) { return; } @@ -59,13 +59,12 @@ public class Promise extends CompletableResult { * @param executor the executor in which the task should be run. * @return a promise that represents the result of running the task provided. */ - public Promise fulfillInAsync(final Callable task, AsyncExecutor executor) { - executor.startProcess(new Callable() { - - @Override - public Void call() throws Exception { - setValue(task.call()); - return null; + public Promise fulfillInAsync(final Callable task, Executor executor) { + executor.execute(() -> { + try { + fulfill(task.call()); + } catch (Exception e) { + fulfillExceptionally(e); } }); return this; @@ -91,18 +90,22 @@ public class Promise extends CompletableResult { */ public Promise then(Function func) { Promise dest = new Promise<>(); - fulfillmentAction = new FunctionAction(this, dest, func); + fulfillmentAction = new TransformAction(this, dest, func); return dest; } + /** + * A consume action provides the action, the value from source promise and fulfills the + * destination promise. + */ private class ConsumeAction implements Runnable { - private Promise current; + private Promise src; private Promise dest; private Consumer action; - public ConsumeAction(Promise current, Promise dest, Consumer action) { - this.current = current; + ConsumeAction(Promise src, Promise dest, Consumer action) { + this.src = src; this.dest = dest; this.action = action; } @@ -110,22 +113,26 @@ public class Promise extends CompletableResult { @Override public void run() { try { - action.accept(current.getValue()); - dest.setValue(null); + action.accept(src.get()); + dest.fulfill(null); } catch (Throwable e) { - dest.setException((Exception) e.getCause()); + dest.fulfillExceptionally((Exception) e.getCause()); } } } - private class FunctionAction implements Runnable { + /** + * A function action provides transformation function, value from source promise and fulfills the + * destination promise with the transformed value. + */ + private class TransformAction implements Runnable { - private Promise current; + private Promise src; private Promise dest; private Function func; - public FunctionAction(Promise current, Promise dest, Function func) { - this.current = current; + TransformAction(Promise src, Promise dest, Function func) { + this.src = src; this.dest = dest; this.func = func; } @@ -133,11 +140,103 @@ public class Promise extends CompletableResult { @Override public void run() { try { - V result = func.apply(current.getValue()); - dest.setValue(result); + V result = func.apply(src.get()); + dest.fulfill(result); } catch (Throwable e) { - dest.setException((Exception) e.getCause()); + dest.fulfillExceptionally((Exception) e.getCause()); } } } } + + +/** + * A really simplified implementation of future that allows completing it successfully with a value + * or exceptionally with an exception. + */ +class PromiseSupport implements Future { + + static final int RUNNING = 1; + static final int FAILED = 2; + static final int COMPLETED = 3; + + final Object lock; + + volatile int state = RUNNING; + T value; + Exception exception; + + PromiseSupport() { + this.lock = new Object(); + } + + void fulfill(T value) { + this.value = value; + this.state = COMPLETED; + synchronized (lock) { + lock.notifyAll(); + } + } + + void fulfillExceptionally(Exception exception) { + this.exception = exception; + this.state = FAILED; + synchronized (lock) { + lock.notifyAll(); + } + } + + @Override + public boolean cancel(boolean mayInterruptIfRunning) { + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + + @Override + public boolean isDone() { + return state > RUNNING; + } + + @Override + public T get() throws InterruptedException, ExecutionException { + if (state == COMPLETED) { + return value; + } else if (state == FAILED) { + throw new ExecutionException(exception); + } else { + synchronized (lock) { + lock.wait(); + if (state == COMPLETED) { + return value; + } else { + throw new ExecutionException(exception); + } + } + } + } + + @Override + public T get(long timeout, TimeUnit unit) + throws InterruptedException, ExecutionException, TimeoutException { + if (state == COMPLETED) { + return value; + } else if (state == FAILED) { + throw new ExecutionException(exception); + } else { + synchronized (lock) { + lock.wait(unit.toMillis(timeout)); + if (state == COMPLETED) { + return value; + } else if (state == FAILED) { + throw new ExecutionException(exception); + } else { + throw new TimeoutException(); + } + } + } + } +} \ No newline at end of file diff --git a/promise/src/test/java/com/iluwatar/promise/AppTest.java b/promise/src/test/java/com/iluwatar/promise/AppTest.java index b59187cb1..b2628127c 100644 --- a/promise/src/test/java/com/iluwatar/promise/AppTest.java +++ b/promise/src/test/java/com/iluwatar/promise/AppTest.java @@ -1,5 +1,7 @@ package com.iluwatar.promise; +import java.util.concurrent.ExecutionException; + import org.junit.Test; /** @@ -9,7 +11,7 @@ import org.junit.Test; public class AppTest { @Test - public void testApp() throws InterruptedException { + public void testApp() throws InterruptedException, ExecutionException { App.main(null); } } diff --git a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java index 9c28be1b3..c64b82d06 100644 --- a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java +++ b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java @@ -1,9 +1,16 @@ package com.iluwatar.promise; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import java.util.function.Function; @@ -12,20 +19,18 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import com.iluwatar.async.method.invocation.ThreadAsyncExecutor; - /** * Tests Promise class. */ public class PromiseTest { - private ThreadAsyncExecutor executor; + private Executor executor; private Promise promise; @Rule public ExpectedException exception = ExpectedException.none(); @Before public void setUp() { - executor = new ThreadAsyncExecutor(); + executor = Executors.newSingleThreadExecutor(); promise = new Promise<>(); } @@ -34,10 +39,70 @@ public class PromiseTest { throws InterruptedException, ExecutionException { promise.fulfillInAsync(new NumberCrunchingTask(), executor); - // await fulfillment - promise.await(); + assertEquals(NumberCrunchingTask.CRUNCHED_NUMBER, promise.get()); + assertTrue(promise.isDone()); + assertFalse(promise.isCancelled()); + } + + @Test + public void promiseIsFulfilledWithAnExceptionIfTaskThrowsAnException() + throws InterruptedException, ExecutionException, TimeoutException { + testWaitingForeverForPromiseToBeFulfilled(); + testWaitingSomeTimeForPromiseToBeFulfilled(); + } - assertEquals(NumberCrunchingTask.CRUNCHED_NUMBER, promise.getValue()); + private void testWaitingForeverForPromiseToBeFulfilled() throws InterruptedException, TimeoutException { + Promise promise = new Promise<>(); + promise.fulfillInAsync(new Callable() { + + @Override + public Integer call() throws Exception { + throw new RuntimeException("Barf!"); + }}, executor); + + try { + promise.get(); + fail("Fetching promise should result in exception if the task threw an exception"); + } catch (ExecutionException ex) { + assertTrue(promise.isDone()); + assertFalse(promise.isCancelled()); + } + + try { + promise.get(1000, TimeUnit.SECONDS); + fail("Fetching promise should result in exception if the task threw an exception"); + } catch (ExecutionException ex) { + assertTrue(promise.isDone()); + assertFalse(promise.isCancelled()); + } + } + + private void testWaitingSomeTimeForPromiseToBeFulfilled() + throws InterruptedException, TimeoutException { + Promise promise = new Promise<>(); + promise.fulfillInAsync(new Callable() { + + @Override + public Integer call() throws Exception { + throw new RuntimeException("Barf!"); + }}, executor); + + try { + promise.get(1000, TimeUnit.SECONDS); + fail("Fetching promise should result in exception if the task threw an exception"); + } catch (ExecutionException ex) { + assertTrue(promise.isDone()); + assertFalse(promise.isCancelled()); + } + + try { + promise.get(); + fail("Fetching promise should result in exception if the task threw an exception"); + } catch (ExecutionException ex) { + assertTrue(promise.isDone()); + assertFalse(promise.isCancelled()); + } + } @Test @@ -50,13 +115,14 @@ public class PromiseTest { }); - // await fulfillment - dependentPromise.await(); + dependentPromise.get(); + assertTrue(dependentPromise.isDone()); + assertFalse(dependentPromise.isCancelled()); } @Test public void dependentPromiseIsFulfilledWithAnExceptionIfConsumerThrowsAnException() - throws InterruptedException, ExecutionException { + throws InterruptedException, ExecutionException, TimeoutException { Promise dependentPromise = promise .fulfillInAsync(new NumberCrunchingTask(), executor) .then(new Consumer() { @@ -67,13 +133,21 @@ public class PromiseTest { } }); - - // await fulfillment - dependentPromise.await(); - - exception.expect(ExecutionException.class); - - dependentPromise.getValue(); + try { + dependentPromise.get(); + fail("Fetching dependent promise should result in exception if the action threw an exception"); + } catch (ExecutionException ex) { + assertTrue(promise.isDone()); + assertFalse(promise.isCancelled()); + } + + try { + dependentPromise.get(1000, TimeUnit.SECONDS); + fail("Fetching dependent promise should result in exception if the action threw an exception"); + } catch (ExecutionException ex) { + assertTrue(promise.isDone()); + assertFalse(promise.isCancelled()); + } } @Test @@ -87,15 +161,14 @@ public class PromiseTest { }); - // await fulfillment - dependentPromise.await(); - - assertEquals(String.valueOf(NumberCrunchingTask.CRUNCHED_NUMBER), dependentPromise.getValue()); + assertEquals(String.valueOf(NumberCrunchingTask.CRUNCHED_NUMBER), dependentPromise.get()); + assertTrue(dependentPromise.isDone()); + assertFalse(dependentPromise.isCancelled()); } @Test public void dependentPromiseIsFulfilledWithAnExceptionIfTheFunctionThrowsException() - throws InterruptedException, ExecutionException { + throws InterruptedException, ExecutionException, TimeoutException { Promise dependentPromise = promise .fulfillInAsync(new NumberCrunchingTask(), executor) .then(new Function() { @@ -106,12 +179,30 @@ public class PromiseTest { } }); - // await fulfillment - dependentPromise.await(); - - exception.expect(ExecutionException.class); - - dependentPromise.getValue(); + try { + dependentPromise.get(); + fail("Fetching dependent promise should result in exception if the function threw an exception"); + } catch (ExecutionException ex) { + assertTrue(promise.isDone()); + assertFalse(promise.isCancelled()); + } + + try { + dependentPromise.get(1000, TimeUnit.SECONDS); + fail("Fetching dependent promise should result in exception if the function threw an exception"); + } catch (ExecutionException ex) { + assertTrue(promise.isDone()); + assertFalse(promise.isCancelled()); + } + } + + @Test + public void fetchingAnAlreadyFulfilledPromiseReturnsTheFulfilledValueImmediately() + throws InterruptedException, ExecutionException, TimeoutException { + Promise promise = new Promise<>(); + promise.fulfill(NumberCrunchingTask.CRUNCHED_NUMBER); + + promise.get(1000, TimeUnit.SECONDS); } private static class NumberCrunchingTask implements Callable { From eb560f5f54b6a928e978b81549d7369f957364a0 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Fri, 22 Jul 2016 16:53:01 +0530 Subject: [PATCH 04/12] Work on #403, removed checkstyle violations --- .../main/java/com/iluwatar/promise/App.java | 2 +- .../java/com/iluwatar/promise/Promise.java | 95 ------------------- .../com/iluwatar/promise/PromiseTest.java | 6 +- 3 files changed, 5 insertions(+), 98 deletions(-) diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java index f9e089f3d..3390f2a23 100644 --- a/promise/src/main/java/com/iluwatar/promise/App.java +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -15,7 +15,7 @@ public class App { * Program entry point * @param args arguments * @throws InterruptedException if main thread is interruped. - * @throws ExecutionException + * @throws ExecutionException if an execution error occurs. */ public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executor = Executors.newSingleThreadExecutor(); diff --git a/promise/src/main/java/com/iluwatar/promise/Promise.java b/promise/src/main/java/com/iluwatar/promise/Promise.java index 991c2a05c..03977c541 100644 --- a/promise/src/main/java/com/iluwatar/promise/Promise.java +++ b/promise/src/main/java/com/iluwatar/promise/Promise.java @@ -3,9 +3,6 @@ package com.iluwatar.promise; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import java.util.function.Function; @@ -147,96 +144,4 @@ public class Promise extends PromiseSupport { } } } -} - - -/** - * A really simplified implementation of future that allows completing it successfully with a value - * or exceptionally with an exception. - */ -class PromiseSupport implements Future { - - static final int RUNNING = 1; - static final int FAILED = 2; - static final int COMPLETED = 3; - - final Object lock; - - volatile int state = RUNNING; - T value; - Exception exception; - - PromiseSupport() { - this.lock = new Object(); - } - - void fulfill(T value) { - this.value = value; - this.state = COMPLETED; - synchronized (lock) { - lock.notifyAll(); - } - } - - void fulfillExceptionally(Exception exception) { - this.exception = exception; - this.state = FAILED; - synchronized (lock) { - lock.notifyAll(); - } - } - - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - - @Override - public boolean isDone() { - return state > RUNNING; - } - - @Override - public T get() throws InterruptedException, ExecutionException { - if (state == COMPLETED) { - return value; - } else if (state == FAILED) { - throw new ExecutionException(exception); - } else { - synchronized (lock) { - lock.wait(); - if (state == COMPLETED) { - return value; - } else { - throw new ExecutionException(exception); - } - } - } - } - - @Override - public T get(long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, TimeoutException { - if (state == COMPLETED) { - return value; - } else if (state == FAILED) { - throw new ExecutionException(exception); - } else { - synchronized (lock) { - lock.wait(unit.toMillis(timeout)); - if (state == COMPLETED) { - return value; - } else if (state == FAILED) { - throw new ExecutionException(exception); - } else { - throw new TimeoutException(); - } - } - } - } } \ No newline at end of file diff --git a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java index c64b82d06..842558589 100644 --- a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java +++ b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java @@ -58,7 +58,8 @@ public class PromiseTest { @Override public Integer call() throws Exception { throw new RuntimeException("Barf!"); - }}, executor); + } + }, executor); try { promise.get(); @@ -85,7 +86,8 @@ public class PromiseTest { @Override public Integer call() throws Exception { throw new RuntimeException("Barf!"); - }}, executor); + } + }, executor); try { promise.get(1000, TimeUnit.SECONDS); From 09ba5ca656dd17ac5c2d518452ad5f89df388e57 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Fri, 22 Jul 2016 18:34:05 +0530 Subject: [PATCH 05/12] Work on #403, added class diagrams and javadocs --- promise/etc/promise.png | Bin 0 -> 59544 bytes promise/etc/promise.ucls | 115 +++++++++++++++++ .../main/java/com/iluwatar/promise/App.java | 44 ++++++- .../java/com/iluwatar/promise/Promise.java | 25 +++- .../com/iluwatar/promise/PromiseSupport.java | 119 ++++++++++++++++++ .../java/com/iluwatar/promise/AppTest.java | 22 ++++ .../com/iluwatar/promise/PromiseTest.java | 22 ++++ 7 files changed, 344 insertions(+), 3 deletions(-) create mode 100644 promise/etc/promise.png create mode 100644 promise/etc/promise.ucls create mode 100644 promise/src/main/java/com/iluwatar/promise/PromiseSupport.java diff --git a/promise/etc/promise.png b/promise/etc/promise.png new file mode 100644 index 0000000000000000000000000000000000000000..1a0f671080915d26268f2ce16df59c430a14926e GIT binary patch literal 59544 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 literal 0 HcmV?d00001 diff --git a/promise/etc/promise.ucls b/promise/etc/promise.ucls new file mode 100644 index 000000000..fe3c6c2e0 --- /dev/null +++ b/promise/etc/promise.ucls @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java index 3390f2a23..6ce7de994 100644 --- a/promise/src/main/java/com/iluwatar/promise/App.java +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -1,5 +1,28 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.promise; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; @@ -7,14 +30,31 @@ import java.util.concurrent.Executors; /** * - * Application that uses promise pattern. + *

The Promise object is used for asynchronous computations. A Promise represents an operation that + * hasn't completed yet, but is expected in the future. + * + *

A Promise represents a proxy for a value not necessarily known when the promise is created. It + * allows you to associate dependent promises to an asynchronous action's eventual success value or + * failure reason. This lets asynchronous methods return values like synchronous methods: instead of the final + * value, the asynchronous method returns a promise of having a value at some point in the future. + * + *

Promises provide a few advantages over callback objects: + *

    + *
  • Functional composition and error handling + *
  • Prevents callback hell and provides callback aggregation + *
+ * + * @see CompletableFuture */ public class App { + private App() { + } + /** * Program entry point * @param args arguments - * @throws InterruptedException if main thread is interruped. + * @throws InterruptedException if main thread is interrupted. * @throws ExecutionException if an execution error occurs. */ public static void main(String[] args) throws InterruptedException, ExecutionException { diff --git a/promise/src/main/java/com/iluwatar/promise/Promise.java b/promise/src/main/java/com/iluwatar/promise/Promise.java index 03977c541..fe7dc6f9f 100644 --- a/promise/src/main/java/com/iluwatar/promise/Promise.java +++ b/promise/src/main/java/com/iluwatar/promise/Promise.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.promise; import java.util.concurrent.Callable; @@ -8,6 +30,7 @@ import java.util.function.Function; /** * Implements the promise pattern. + * * @param type of result. */ public class Promise extends PromiseSupport { @@ -41,7 +64,7 @@ public class Promise extends PromiseSupport { postFulfillment(); } - void postFulfillment() { + private void postFulfillment() { if (fulfillmentAction == null) { return; } diff --git a/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java b/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java new file mode 100644 index 000000000..dde2ca452 --- /dev/null +++ b/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java @@ -0,0 +1,119 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.promise; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +/** + * A really simplified implementation of future that allows completing it successfully with a value + * or exceptionally with an exception. + */ +class PromiseSupport implements Future { + + static final int RUNNING = 1; + static final int FAILED = 2; + static final int COMPLETED = 3; + + final Object lock; + + volatile int state = RUNNING; + T value; + Exception exception; + + PromiseSupport() { + this.lock = new Object(); + } + + void fulfill(T value) { + this.value = value; + this.state = COMPLETED; + synchronized (lock) { + lock.notifyAll(); + } + } + + void fulfillExceptionally(Exception exception) { + this.exception = exception; + this.state = FAILED; + synchronized (lock) { + lock.notifyAll(); + } + } + + @Override + public boolean cancel(boolean mayInterruptIfRunning) { + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + + @Override + public boolean isDone() { + return state > RUNNING; + } + + @Override + public T get() throws InterruptedException, ExecutionException { + if (state == COMPLETED) { + return value; + } else if (state == FAILED) { + throw new ExecutionException(exception); + } else { + synchronized (lock) { + lock.wait(); + if (state == COMPLETED) { + return value; + } else { + throw new ExecutionException(exception); + } + } + } + } + + @Override + public T get(long timeout, TimeUnit unit) + throws InterruptedException, ExecutionException, TimeoutException { + if (state == COMPLETED) { + return value; + } else if (state == FAILED) { + throw new ExecutionException(exception); + } else { + synchronized (lock) { + lock.wait(unit.toMillis(timeout)); + if (state == COMPLETED) { + return value; + } else if (state == FAILED) { + throw new ExecutionException(exception); + } else { + throw new TimeoutException(); + } + } + } + } +} \ No newline at end of file diff --git a/promise/src/test/java/com/iluwatar/promise/AppTest.java b/promise/src/test/java/com/iluwatar/promise/AppTest.java index b2628127c..1d1cb061d 100644 --- a/promise/src/test/java/com/iluwatar/promise/AppTest.java +++ b/promise/src/test/java/com/iluwatar/promise/AppTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.promise; import java.util.concurrent.ExecutionException; diff --git a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java index 842558589..de0ecb6d7 100644 --- a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java +++ b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.promise; import static org.junit.Assert.assertEquals; From 40ac5525421fa2932224048fce76aded3fe3f332 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Sun, 24 Jul 2016 01:45:49 +0530 Subject: [PATCH 06/12] Work on #403, added README --- promise/README.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 promise/README.md diff --git a/promise/README.md b/promise/README.md new file mode 100644 index 000000000..069a8dbfe --- /dev/null +++ b/promise/README.md @@ -0,0 +1,45 @@ +--- +layout: pattern +title: Promise +folder: promise +permalink: /patterns/promise/ +categories: Structural +tags: + - Java + - Concurrency + - Difficulty-Intermediate +--- + +## Also known as +CompletableFuture + +## Intent +A Promise represents a proxy for a value not necessarily known when the promise is created. It +allows you to associate dependent promises to an asynchronous action's eventual success value or +failure reason. Promises are a way to write async code that still appears as though it is executing +in a synchronous way. + +![alt text](./etc/promise.png "Promise") + +## Applicability +Promise pattern is applicable in concurrent programming when some work needs to be done asynchronously +and: + +* code maintainablity and readability suffers due to callback hell. +* you need to compose promises and need better error handling for asynchronous tasks. +* you want to use functional style of programming. + + +## Real world examples + +* [java.util.concurrent.CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html) +* [Guava ListenableFuture](https://github.com/google/guava/wiki/ListenableFutureExplained) + +## Related Patterns + * Async Method Invocation + * Callback + +## Credits + +* [You are missing the point to Promises](https://gist.github.com/domenic/3889970) +* [Functional style callbacks using CompleteableFuture](https://www.infoq.com/articles/Functional-Style-Callbacks-Using-CompletableFuture) From 76970633b8a654e05d4341e96ee639bc3bcde969 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Thu, 4 Aug 2016 18:10:50 +0530 Subject: [PATCH 07/12] Work on #403, incorporate review changes --- promise/README.md | 5 +- promise/etc/promise.ucls | 46 ++++++------ .../main/java/com/iluwatar/promise/App.java | 73 +++++++++++++++---- .../java/com/iluwatar/promise/Promise.java | 16 ++-- .../com/iluwatar/promise/PromiseSupport.java | 14 ++-- 5 files changed, 100 insertions(+), 54 deletions(-) diff --git a/promise/README.md b/promise/README.md index 069a8dbfe..638bb3ef5 100644 --- a/promise/README.md +++ b/promise/README.md @@ -3,10 +3,11 @@ layout: pattern title: Promise folder: promise permalink: /patterns/promise/ -categories: Structural +categories: Concurrency tags: - Java - - Concurrency + - Functional + - Reactive - Difficulty-Intermediate --- diff --git a/promise/etc/promise.ucls b/promise/etc/promise.ucls index fe3c6c2e0..cdfb6ed7f 100644 --- a/promise/etc/promise.ucls +++ b/promise/etc/promise.ucls @@ -74,38 +74,38 @@ - - - - - - - - - + - - - - - - - - - - - - - + + + + + - + + + + + + + + + + + + + + + + + diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java index 6ce7de994..3a1ecfa01 100644 --- a/promise/src/main/java/com/iluwatar/promise/App.java +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -22,6 +22,15 @@ */ package com.iluwatar.promise; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; @@ -44,6 +53,8 @@ import java.util.concurrent.Executors; *
  • Prevents callback hell and provides callback aggregation * * + *

    + * * @see CompletableFuture */ public class App { @@ -68,23 +79,57 @@ public class App { private static void promiseUsage(Executor executor) throws InterruptedException, ExecutionException { - Promise consumedPromise = new Promise<>(); - consumedPromise.fulfillInAsync(() -> { - Thread.sleep(1000); - return 10; - }, executor).then(value -> { - System.out.println("Consumed int value: " + value); + String urlString = "https://raw.githubusercontent.com/iluwatar/java-design-patterns/Promise/promise/README.md"; + Promise lineCountPromise = new Promise().fulfillInAsync(() -> { + return downloadFile(urlString); + }, executor).then(fileLocation -> { + return countLines(fileLocation); }); - Promise transformedPromise = new Promise<>(); - transformedPromise.fulfillInAsync(() -> { - Thread.sleep(1000); - return "10"; - }, executor).then(value -> { return Integer.parseInt(value); }).then(value -> { - System.out.println("Consumed transformed int value: " + value); + Promise> charFrequencyPromise = new Promise().fulfillInAsync(() -> { + return String.valueOf(downloadFile(urlString)); + }, executor).then(fileLocation -> { + return characterFrequency(fileLocation); }); - consumedPromise.get(); - transformedPromise.get(); + lineCountPromise.get(); + System.out.println("Line count is: " + lineCountPromise.get()); + charFrequencyPromise.get(); + System.out.println("Char frequency is: " + charFrequencyPromise.get()); + } + + private static Map characterFrequency(String fileLocation) { + // TODO Auto-generated method stub + return null; + } + + private static Integer countLines(String fileLocation) { + int lineCount = 0; + try (Reader reader = new FileReader(fileLocation); + BufferedReader bufferedReader = new BufferedReader(reader);) { + for (String line; (line = bufferedReader.readLine()) != null; ) { + lineCount++; + } + } catch (IOException ex) { + ex.printStackTrace(); + } + return lineCount; + } + + private static String downloadFile(String urlString) throws InterruptedException, IOException { + URL url = new URL(urlString); + File file = File.createTempFile("promise_pattern", null); + try (Reader reader = new InputStreamReader(url.openStream()); + BufferedReader bufferedReader = new BufferedReader(reader); + FileWriter writer = new FileWriter(file)) { + for (String line; (line = bufferedReader.readLine()) != null; ) { + writer.write(line); + writer.write("\n"); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + System.out.println("File downloaded at: " + file.getAbsolutePath()); + return file.getAbsolutePath(); } } diff --git a/promise/src/main/java/com/iluwatar/promise/Promise.java b/promise/src/main/java/com/iluwatar/promise/Promise.java index fe7dc6f9f..7d8a97e84 100644 --- a/promise/src/main/java/com/iluwatar/promise/Promise.java +++ b/promise/src/main/java/com/iluwatar/promise/Promise.java @@ -120,11 +120,11 @@ public class Promise extends PromiseSupport { */ private class ConsumeAction implements Runnable { - private Promise src; - private Promise dest; - private Consumer action; + private final Promise src; + private final Promise dest; + private final Consumer action; - ConsumeAction(Promise src, Promise dest, Consumer action) { + private ConsumeAction(Promise src, Promise dest, Consumer action) { this.src = src; this.dest = dest; this.action = action; @@ -147,11 +147,11 @@ public class Promise extends PromiseSupport { */ private class TransformAction implements Runnable { - private Promise src; - private Promise dest; - private Function func; + private final Promise src; + private final Promise dest; + private final Function func; - TransformAction(Promise src, Promise dest, Function func) { + private TransformAction(Promise src, Promise dest, Function func) { this.src = src; this.dest = dest; this.func = func; diff --git a/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java b/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java index dde2ca452..048586e23 100644 --- a/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java +++ b/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java @@ -33,15 +33,15 @@ import java.util.concurrent.TimeoutException; */ class PromiseSupport implements Future { - static final int RUNNING = 1; - static final int FAILED = 2; - static final int COMPLETED = 3; + private static final int RUNNING = 1; + private static final int FAILED = 2; + private static final int COMPLETED = 3; - final Object lock; + private final Object lock; - volatile int state = RUNNING; - T value; - Exception exception; + private volatile int state = RUNNING; + private T value; + private Exception exception; PromiseSupport() { this.lock = new Object(); From 95cf9fe367c7c7c58e80f9b35ef5db0ca00c63e5 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Mon, 22 Aug 2016 18:43:29 +0530 Subject: [PATCH 08/12] Work on #403, made example readable and moved methods into utility --- promise/etc/promise.png | Bin 59544 -> 55725 bytes promise/etc/promise.ucls | 30 ++--- .../main/java/com/iluwatar/promise/App.java | 127 ++++++++++-------- .../java/com/iluwatar/promise/Utility.java | 91 +++++++++++++ 4 files changed, 172 insertions(+), 76 deletions(-) create mode 100644 promise/src/main/java/com/iluwatar/promise/Utility.java diff --git a/promise/etc/promise.png b/promise/etc/promise.png index 1a0f671080915d26268f2ce16df59c430a14926e..0aef198acb4e9abdb4cf5b34f61869b46e870c8a 100644 GIT binary patch literal 55725 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 B1!4dI literal 59544 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 diff --git a/promise/etc/promise.ucls b/promise/etc/promise.ucls index cdfb6ed7f..e7fefec1c 100644 --- a/promise/etc/promise.ucls +++ b/promise/etc/promise.ucls @@ -25,7 +25,7 @@ - + @@ -67,42 +67,38 @@ - + - + - - - - - + - + + + + + - - - - - + - - - + + + diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java index 3a1ecfa01..1315f0927 100644 --- a/promise/src/main/java/com/iluwatar/promise/App.java +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -21,19 +21,10 @@ * THE SOFTWARE. */ package com.iluwatar.promise; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.net.URL; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -59,7 +50,12 @@ import java.util.concurrent.Executors; */ public class App { + private static final String URL = "https://raw.githubusercontent.com/iluwatar/java-design-patterns/Promise/promise/README.md"; + private ExecutorService executor; + private CountDownLatch canStop = new CountDownLatch(2); + private App() { + executor = Executors.newFixedThreadPool(2); } /** @@ -69,67 +65,80 @@ public class App { * @throws ExecutionException if an execution error occurs. */ public static void main(String[] args) throws InterruptedException, ExecutionException { - ExecutorService executor = Executors.newSingleThreadExecutor(); + App app = new App(); try { - promiseUsage(executor); + app.run(); } finally { - executor.shutdownNow(); + app.stop(); } } - private static void promiseUsage(Executor executor) - throws InterruptedException, ExecutionException { - String urlString = "https://raw.githubusercontent.com/iluwatar/java-design-patterns/Promise/promise/README.md"; - Promise lineCountPromise = new Promise().fulfillInAsync(() -> { - return downloadFile(urlString); - }, executor).then(fileLocation -> { - return countLines(fileLocation); - }); + private void run() throws InterruptedException, ExecutionException { + promiseUsage(); + } + + private void promiseUsage() { - Promise> charFrequencyPromise = new Promise().fulfillInAsync(() -> { - return String.valueOf(downloadFile(urlString)); - }, executor).then(fileLocation -> { - return characterFrequency(fileLocation); - }); + countLines() + .then( + count -> { + System.out.println("Line count is: " + count); + taskCompleted(); + } + ); - lineCountPromise.get(); - System.out.println("Line count is: " + lineCountPromise.get()); - charFrequencyPromise.get(); - System.out.println("Char frequency is: " + charFrequencyPromise.get()); + lowestCharFrequency() + .then( + charFrequency -> { + System.out.println("Char with lowest frequency is: " + charFrequency); + taskCompleted(); + } + ); } - private static Map characterFrequency(String fileLocation) { - // TODO Auto-generated method stub - return null; + private Promise lowestCharFrequency() { + return characterFrequency() + .then( + charFrequency -> { + return Utility.lowestFrequencyChar(charFrequency).orElse(null); + } + ); } - private static Integer countLines(String fileLocation) { - int lineCount = 0; - try (Reader reader = new FileReader(fileLocation); - BufferedReader bufferedReader = new BufferedReader(reader);) { - for (String line; (line = bufferedReader.readLine()) != null; ) { - lineCount++; - } - } catch (IOException ex) { - ex.printStackTrace(); - } - return lineCount; + private Promise> characterFrequency() { + return download(URL) + .then( + fileLocation -> { + return Utility.characterFrequency(fileLocation); + } + ); } - private static String downloadFile(String urlString) throws InterruptedException, IOException { - URL url = new URL(urlString); - File file = File.createTempFile("promise_pattern", null); - try (Reader reader = new InputStreamReader(url.openStream()); - BufferedReader bufferedReader = new BufferedReader(reader); - FileWriter writer = new FileWriter(file)) { - for (String line; (line = bufferedReader.readLine()) != null; ) { - writer.write(line); - writer.write("\n"); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - System.out.println("File downloaded at: " + file.getAbsolutePath()); - return file.getAbsolutePath(); + private Promise countLines() { + return download(URL) + .then( + fileLocation -> { + return Utility.countLines(fileLocation); + } + ); + } + + private Promise download(String urlString) { + Promise downloadPromise = new Promise() + .fulfillInAsync( + () -> { + return Utility.downloadFile(urlString); + }, executor); + + return downloadPromise; + } + + private void stop() throws InterruptedException { + canStop.await(); + executor.shutdownNow(); + } + + private void taskCompleted() { + canStop.countDown(); } } diff --git a/promise/src/main/java/com/iluwatar/promise/Utility.java b/promise/src/main/java/com/iluwatar/promise/Utility.java new file mode 100644 index 000000000..2cfad46d0 --- /dev/null +++ b/promise/src/main/java/com/iluwatar/promise/Utility.java @@ -0,0 +1,91 @@ +package com.iluwatar.promise; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Optional; +import java.util.Map.Entry; + +public class Utility { + + public static Map characterFrequency(String fileLocation) { + Map characterToFrequency = new HashMap<>(); + try (Reader reader = new FileReader(fileLocation); + BufferedReader bufferedReader = new BufferedReader(reader);) { + for (String line; (line = bufferedReader.readLine()) != null;) { + for (char c : line.toCharArray()) { + if (!characterToFrequency.containsKey(c)) { + characterToFrequency.put(c, 1); + } else { + characterToFrequency.put(c, characterToFrequency.get(c) + 1); + } + } + } + } catch (IOException ex) { + ex.printStackTrace(); + } + return characterToFrequency; + } + + public static Optional lowestFrequencyChar(Map charFrequency) { + Optional lowestFrequencyChar = Optional.empty(); + if (charFrequency.isEmpty()) { + return lowestFrequencyChar; + } + + Iterator> iterator = charFrequency.entrySet().iterator(); + Entry entry = iterator.next(); + int minFrequency = entry.getValue(); + lowestFrequencyChar = Optional.of(entry.getKey()); + + while (iterator.hasNext()) { + entry = iterator.next(); + if (entry.getValue() < minFrequency) { + minFrequency = entry.getValue(); + lowestFrequencyChar = Optional.of(entry.getKey()); + } + } + + return lowestFrequencyChar; + } + + public static Integer countLines(String fileLocation) { + int lineCount = 0; + try (Reader reader = new FileReader(fileLocation); + BufferedReader bufferedReader = new BufferedReader(reader);) { + while (bufferedReader.readLine() != null) { + lineCount++; + } + } catch (IOException ex) { + ex.printStackTrace(); + } + return lineCount; + } + + public static String downloadFile(String urlString) throws MalformedURLException, IOException { + System.out.println("Downloading contents from url: " + urlString); + URL url = new URL(urlString); + File file = File.createTempFile("promise_pattern", null); + try (Reader reader = new InputStreamReader(url.openStream()); + BufferedReader bufferedReader = new BufferedReader(reader); + FileWriter writer = new FileWriter(file)) { + for (String line; (line = bufferedReader.readLine()) != null; ) { + writer.write(line); + writer.write("\n"); + } + System.out.println("File downloaded at: " + file.getAbsolutePath()); + return file.getAbsolutePath(); + } catch (IOException ex) { + throw ex; + } + } +} From 483c61a82af39ba7fc9c226bf112dc8db511e429 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Mon, 29 Aug 2016 00:16:36 +0530 Subject: [PATCH 09/12] Some refactoring, added javadocs --- .../main/java/com/iluwatar/promise/App.java | 141 +++++++++++------- .../java/com/iluwatar/promise/Promise.java | 36 ++++- .../java/com/iluwatar/promise/Utility.java | 46 +++--- .../com/iluwatar/promise/PromiseTest.java | 46 ++++-- 4 files changed, 175 insertions(+), 94 deletions(-) diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java index 1315f0927..2b2ae78b4 100644 --- a/promise/src/main/java/com/iluwatar/promise/App.java +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -29,35 +29,45 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** - * - *

    The Promise object is used for asynchronous computations. A Promise represents an operation that - * hasn't completed yet, but is expected in the future. - * - *

    A Promise represents a proxy for a value not necessarily known when the promise is created. It - * allows you to associate dependent promises to an asynchronous action's eventual success value or - * failure reason. This lets asynchronous methods return values like synchronous methods: instead of the final - * value, the asynchronous method returns a promise of having a value at some point in the future. - * + * + * The Promise object is used for asynchronous computations. A Promise represents an operation + * that hasn't completed yet, but is expected in the future. + * + *

    A Promise represents a proxy for a value not necessarily known when the promise is created. It + * allows you to associate dependent promises to an asynchronous action's eventual success value or + * failure reason. This lets asynchronous methods return values like synchronous methods: instead + * of the final value, the asynchronous method returns a promise of having a value at some point + * in the future. + * *

    Promises provide a few advantages over callback objects: *

    - * + * *

    + * In this application the usage of promise is demonstrated with two examples: + *

      + *
    • Count Lines: In this example a file is downloaded and its line count is calculated. + * The calculated line count is then consumed and printed on console. + *
    • Lowest Character Frequency: In this example a file is downloaded and its lowest frequency + * character is found and printed on console. This happens via a chain of promises, we start with + * a file download promise, then a promise of character frequency, then a promise of lowest frequency + * character which is finally consumed and result is printed on console. + *
    * * @see CompletableFuture */ public class App { - private static final String URL = "https://raw.githubusercontent.com/iluwatar/java-design-patterns/Promise/promise/README.md"; + private static final String DEFAULT_URL = "https://raw.githubusercontent.com/iluwatar/java-design-patterns/Promise/promise/README.md"; private ExecutorService executor; - private CountDownLatch canStop = new CountDownLatch(2); - + private CountDownLatch stopLatch = new CountDownLatch(2); + private App() { executor = Executors.newFixedThreadPool(2); } - + /** * Program entry point * @param args arguments @@ -67,28 +77,25 @@ public class App { public static void main(String[] args) throws InterruptedException, ExecutionException { App app = new App(); try { - app.run(); + app.promiseUsage(); } finally { app.stop(); } } - private void run() throws InterruptedException, ExecutionException { - promiseUsage(); + private void promiseUsage() { + calculateLineCount(); + + calculateLowestFrequencyChar(); } - private void promiseUsage() { - - countLines() - .then( - count -> { - System.out.println("Line count is: " + count); - taskCompleted(); - } - ); - - lowestCharFrequency() - .then( + /* + * Calculate the lowest frequency character and when that promise is fulfilled, + * consume the result in a Consumer + */ + private void calculateLowestFrequencyChar() { + lowestFrequencyChar() + .thenAccept( charFrequency -> { System.out.println("Char with lowest frequency is: " + charFrequency); taskCompleted(); @@ -96,49 +103,73 @@ public class App { ); } - private Promise lowestCharFrequency() { - return characterFrequency() - .then( - charFrequency -> { - return Utility.lowestFrequencyChar(charFrequency).orElse(null); - } - ); - } - - private Promise> characterFrequency() { - return download(URL) - .then( - fileLocation -> { - return Utility.characterFrequency(fileLocation); + /* + * Calculate the line count and when that promise is fulfilled, consume the result + * in a Consumer + */ + private void calculateLineCount() { + countLines() + .thenAccept( + count -> { + System.out.println("Line count is: " + count); + taskCompleted(); } ); } - private Promise countLines() { - return download(URL) - .then( - fileLocation -> { - return Utility.countLines(fileLocation); - } - ); + /* + * Calculate the character frequency of a file and when that promise is fulfilled, + * then promise to apply function to calculate lowest character frequency. + */ + private Promise lowestFrequencyChar() { + return characterFrequency() + .thenApply(Utility::lowestFrequencyChar); } + /* + * Download the file at DEFAULT_URL and when that promise is fulfilled, + * then promise to apply function to calculate character frequency. + */ + private Promise> characterFrequency() { + return download(DEFAULT_URL) + .thenApply(Utility::characterFrequency); + } + + /* + * Download the file at DEFAULT_URL and when that promise is fulfilled, + * then promise to apply function to count lines in that file. + */ + private Promise countLines() { + return download(DEFAULT_URL) + .thenApply(Utility::countLines); + } + + /* + * Return a promise to provide the local absolute path of the file downloaded in background. + * This is an async method and does not wait until the file is downloaded. + */ private Promise download(String urlString) { Promise downloadPromise = new Promise() .fulfillInAsync( () -> { return Utility.downloadFile(urlString); - }, executor); - + }, executor) + .onError( + throwable -> { + throwable.printStackTrace(); + taskCompleted(); + } + ); + return downloadPromise; } private void stop() throws InterruptedException { - canStop.await(); + stopLatch.await(); executor.shutdownNow(); } - + private void taskCompleted() { - canStop.countDown(); + stopLatch.countDown(); } } diff --git a/promise/src/main/java/com/iluwatar/promise/Promise.java b/promise/src/main/java/com/iluwatar/promise/Promise.java index 7d8a97e84..870e1556d 100644 --- a/promise/src/main/java/com/iluwatar/promise/Promise.java +++ b/promise/src/main/java/com/iluwatar/promise/Promise.java @@ -36,6 +36,7 @@ import java.util.function.Function; public class Promise extends PromiseSupport { private Runnable fulfillmentAction; + private Consumer exceptionHandler; /** * Creates a promise that will be fulfilled in future. @@ -61,9 +62,17 @@ public class Promise extends PromiseSupport { @Override public void fulfillExceptionally(Exception exception) { super.fulfillExceptionally(exception); + handleException(exception); postFulfillment(); } + private void handleException(Exception exception) { + if (exceptionHandler == null) { + return; + } + exceptionHandler.accept(exception); + } + private void postFulfillment() { if (fulfillmentAction == null) { return; @@ -83,8 +92,8 @@ public class Promise extends PromiseSupport { executor.execute(() -> { try { fulfill(task.call()); - } catch (Exception e) { - fulfillExceptionally(e); + } catch (Exception ex) { + fulfillExceptionally(ex); } }); return this; @@ -96,11 +105,22 @@ public class Promise extends PromiseSupport { * @param action action to be executed. * @return a new promise. */ - public Promise then(Consumer action) { + public Promise thenAccept(Consumer action) { Promise dest = new Promise<>(); fulfillmentAction = new ConsumeAction(this, dest, action); return dest; } + + /** + * Set the exception handler on this promise. + * @param exceptionHandler a consumer that will handle the exception occurred while fulfilling + * the promise. + * @return this + */ + public Promise onError(Consumer exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return this; + } /** * Returns a new promise that, when this promise is fulfilled normally, is fulfilled with @@ -108,7 +128,7 @@ public class Promise extends PromiseSupport { * @param func function to be executed. * @return a new promise. */ - public Promise then(Function func) { + public Promise thenApply(Function func) { Promise dest = new Promise<>(); fulfillmentAction = new TransformAction(this, dest, func); return dest; @@ -135,8 +155,8 @@ public class Promise extends PromiseSupport { try { action.accept(src.get()); dest.fulfill(null); - } catch (Throwable e) { - dest.fulfillExceptionally((Exception) e.getCause()); + } catch (Throwable throwable) { + dest.fulfillExceptionally((Exception) throwable.getCause()); } } } @@ -162,8 +182,8 @@ public class Promise extends PromiseSupport { try { V result = func.apply(src.get()); dest.fulfill(result); - } catch (Throwable e) { - dest.fulfillExceptionally((Exception) e.getCause()); + } catch (Throwable throwable) { + dest.fulfillExceptionally((Exception) throwable.getCause()); } } } diff --git a/promise/src/main/java/com/iluwatar/promise/Utility.java b/promise/src/main/java/com/iluwatar/promise/Utility.java index 2cfad46d0..8d5be2538 100644 --- a/promise/src/main/java/com/iluwatar/promise/Utility.java +++ b/promise/src/main/java/com/iluwatar/promise/Utility.java @@ -12,15 +12,19 @@ import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import java.util.Optional; import java.util.Map.Entry; public class Utility { + /** + * Calculates character frequency of the file provided. + * @param fileLocation location of the file. + * @return a map of character to its frequency, an empty map if file does not exist. + */ public static Map characterFrequency(String fileLocation) { Map characterToFrequency = new HashMap<>(); - try (Reader reader = new FileReader(fileLocation); - BufferedReader bufferedReader = new BufferedReader(reader);) { + try (Reader reader = new FileReader(fileLocation); + BufferedReader bufferedReader = new BufferedReader(reader)) { for (String line; (line = bufferedReader.readLine()) != null;) { for (char c : line.toCharArray()) { if (!characterToFrequency.containsKey(c)) { @@ -35,33 +39,35 @@ public class Utility { } return characterToFrequency; } - - public static Optional lowestFrequencyChar(Map charFrequency) { - Optional lowestFrequencyChar = Optional.empty(); - if (charFrequency.isEmpty()) { - return lowestFrequencyChar; - } - + + /** + * @return the character with lowest frequency if it exists, {@code Optional.empty()} otherwise. + */ + public static Character lowestFrequencyChar(Map charFrequency) { + Character lowestFrequencyChar = null; Iterator> iterator = charFrequency.entrySet().iterator(); Entry entry = iterator.next(); int minFrequency = entry.getValue(); - lowestFrequencyChar = Optional.of(entry.getKey()); - + lowestFrequencyChar = entry.getKey(); + while (iterator.hasNext()) { entry = iterator.next(); if (entry.getValue() < minFrequency) { minFrequency = entry.getValue(); - lowestFrequencyChar = Optional.of(entry.getKey()); + lowestFrequencyChar = entry.getKey(); } } - + return lowestFrequencyChar; } - + + /** + * @return number of lines in the file at provided location. 0 if file does not exist. + */ public static Integer countLines(String fileLocation) { int lineCount = 0; - try (Reader reader = new FileReader(fileLocation); - BufferedReader bufferedReader = new BufferedReader(reader);) { + try (Reader reader = new FileReader(fileLocation); + BufferedReader bufferedReader = new BufferedReader(reader)) { while (bufferedReader.readLine() != null) { lineCount++; } @@ -71,11 +77,15 @@ public class Utility { return lineCount; } + /** + * Downloads the contents from the given urlString, and stores it in a temporary directory. + * @return the absolute path of the file downloaded. + */ public static String downloadFile(String urlString) throws MalformedURLException, IOException { System.out.println("Downloading contents from url: " + urlString); URL url = new URL(urlString); File file = File.createTempFile("promise_pattern", null); - try (Reader reader = new InputStreamReader(url.openStream()); + try (Reader reader = new InputStreamReader(url.openStream()); BufferedReader bufferedReader = new BufferedReader(reader); FileWriter writer = new FileWriter(file)) { for (String line; (line = bufferedReader.readLine()) != null; ) { diff --git a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java index de0ecb6d7..45c4c1d36 100644 --- a/promise/src/test/java/com/iluwatar/promise/PromiseTest.java +++ b/promise/src/test/java/com/iluwatar/promise/PromiseTest.java @@ -26,6 +26,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; @@ -40,7 +43,6 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; - /** * Tests Promise class. */ @@ -73,7 +75,8 @@ public class PromiseTest { testWaitingSomeTimeForPromiseToBeFulfilled(); } - private void testWaitingForeverForPromiseToBeFulfilled() throws InterruptedException, TimeoutException { + private void testWaitingForeverForPromiseToBeFulfilled() + throws InterruptedException, TimeoutException { Promise promise = new Promise<>(); promise.fulfillInAsync(new Callable() { @@ -134,7 +137,7 @@ public class PromiseTest { throws InterruptedException, ExecutionException { Promise dependentPromise = promise .fulfillInAsync(new NumberCrunchingTask(), executor) - .then(value -> { + .thenAccept(value -> { assertEquals(NumberCrunchingTask.CRUNCHED_NUMBER, value); }); @@ -149,17 +152,18 @@ public class PromiseTest { throws InterruptedException, ExecutionException, TimeoutException { Promise dependentPromise = promise .fulfillInAsync(new NumberCrunchingTask(), executor) - .then(new Consumer() { + .thenAccept(new Consumer() { @Override - public void accept(Integer t) { + public void accept(Integer value) { throw new RuntimeException("Barf!"); } }); try { dependentPromise.get(); - fail("Fetching dependent promise should result in exception if the action threw an exception"); + fail("Fetching dependent promise should result in exception " + + "if the action threw an exception"); } catch (ExecutionException ex) { assertTrue(promise.isDone()); assertFalse(promise.isCancelled()); @@ -167,7 +171,8 @@ public class PromiseTest { try { dependentPromise.get(1000, TimeUnit.SECONDS); - fail("Fetching dependent promise should result in exception if the action threw an exception"); + fail("Fetching dependent promise should result in exception " + + "if the action threw an exception"); } catch (ExecutionException ex) { assertTrue(promise.isDone()); assertFalse(promise.isCancelled()); @@ -179,7 +184,7 @@ public class PromiseTest { throws InterruptedException, ExecutionException { Promise dependentPromise = promise .fulfillInAsync(new NumberCrunchingTask(), executor) - .then(value -> { + .thenApply(value -> { assertEquals(NumberCrunchingTask.CRUNCHED_NUMBER, value); return String.valueOf(value); }); @@ -195,17 +200,18 @@ public class PromiseTest { throws InterruptedException, ExecutionException, TimeoutException { Promise dependentPromise = promise .fulfillInAsync(new NumberCrunchingTask(), executor) - .then(new Function() { + .thenApply(new Function() { @Override - public String apply(Integer t) { + public String apply(Integer value) { throw new RuntimeException("Barf!"); } }); try { dependentPromise.get(); - fail("Fetching dependent promise should result in exception if the function threw an exception"); + fail("Fetching dependent promise should result in exception " + + "if the function threw an exception"); } catch (ExecutionException ex) { assertTrue(promise.isDone()); assertFalse(promise.isCancelled()); @@ -213,7 +219,8 @@ public class PromiseTest { try { dependentPromise.get(1000, TimeUnit.SECONDS); - fail("Fetching dependent promise should result in exception if the function threw an exception"); + fail("Fetching dependent promise should result in exception " + + "if the function threw an exception"); } catch (ExecutionException ex) { assertTrue(promise.isDone()); assertFalse(promise.isCancelled()); @@ -228,6 +235,19 @@ public class PromiseTest { promise.get(1000, TimeUnit.SECONDS); } + + @SuppressWarnings("unchecked") + @Test + public void exceptionHandlerIsCalledWhenPromiseIsFulfilledExceptionally() { + Promise promise = new Promise<>(); + Consumer exceptionHandler = mock(Consumer.class); + promise.onError(exceptionHandler); + + Exception exception = new Exception("barf!"); + promise.fulfillExceptionally(exception); + + verify(exceptionHandler).accept(eq(exception)); + } private static class NumberCrunchingTask implements Callable { @@ -236,7 +256,7 @@ public class PromiseTest { @Override public Integer call() throws Exception { // Do number crunching - Thread.sleep(1000); + Thread.sleep(100); return CRUNCHED_NUMBER; } } From 5796e1967f85cd276d1b5fb311b3f1007bbcb8ae Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Mon, 29 Aug 2016 11:50:33 +0530 Subject: [PATCH 10/12] Work on #403, updated diagram and finishing touches --- promise/etc/promise.png | Bin 55725 -> 59210 bytes promise/etc/promise.ucls | 38 +++++++++--------- .../main/java/com/iluwatar/promise/App.java | 5 ++- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/promise/etc/promise.png b/promise/etc/promise.png index 0aef198acb4e9abdb4cf5b34f61869b46e870c8a..cdb43eb6b49a11b317d7c8abbb8ef3fd43ec3779 100644 GIT binary patch literal 59210 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 B1!4dI diff --git a/promise/etc/promise.ucls b/promise/etc/promise.ucls index e7fefec1c..79a11e7d5 100644 --- a/promise/etc/promise.ucls +++ b/promise/etc/promise.ucls @@ -31,7 +31,7 @@ - + @@ -40,7 +40,7 @@ - + @@ -49,7 +49,7 @@ - + @@ -58,7 +58,7 @@ - + @@ -67,41 +67,41 @@ - + - - - - - - - - - + - + - + - + - + - + + + + + + + + + diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java index 2b2ae78b4..672c20bfa 100644 --- a/promise/src/main/java/com/iluwatar/promise/App.java +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -61,11 +61,12 @@ import java.util.concurrent.Executors; public class App { private static final String DEFAULT_URL = "https://raw.githubusercontent.com/iluwatar/java-design-patterns/Promise/promise/README.md"; - private ExecutorService executor; - private CountDownLatch stopLatch = new CountDownLatch(2); + private final ExecutorService executor; + private final CountDownLatch stopLatch; private App() { executor = Executors.newFixedThreadPool(2); + stopLatch = new CountDownLatch(2); } /** From ad11ea46b11e638ee564b86eaf2e5763a3f780f1 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Mon, 29 Aug 2016 11:55:30 +0530 Subject: [PATCH 11/12] Work on #403, javadocs updated --- promise/src/main/java/com/iluwatar/promise/Promise.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/promise/src/main/java/com/iluwatar/promise/Promise.java b/promise/src/main/java/com/iluwatar/promise/Promise.java index 870e1556d..3165142fa 100644 --- a/promise/src/main/java/com/iluwatar/promise/Promise.java +++ b/promise/src/main/java/com/iluwatar/promise/Promise.java @@ -29,7 +29,11 @@ import java.util.function.Consumer; import java.util.function.Function; /** - * Implements the promise pattern. + * A Promise represents a proxy for a value not necessarily known when the promise is created. It + * allows you to associate dependent promises to an asynchronous action's eventual success value or + * failure reason. This lets asynchronous methods return values like synchronous methods: instead + * of the final value, the asynchronous method returns a promise of having a value at some point + * in the future. * * @param type of result. */ From 59cf1003021f32b3e51dfaa27b7f50fb17f2c8ba Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Mon, 29 Aug 2016 12:04:24 +0530 Subject: [PATCH 12/12] #403, updated javadocs --- promise/src/main/java/com/iluwatar/promise/Promise.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/promise/src/main/java/com/iluwatar/promise/Promise.java b/promise/src/main/java/com/iluwatar/promise/Promise.java index 3165142fa..e7e56837b 100644 --- a/promise/src/main/java/com/iluwatar/promise/Promise.java +++ b/promise/src/main/java/com/iluwatar/promise/Promise.java @@ -139,7 +139,7 @@ public class Promise extends PromiseSupport { } /** - * A consume action provides the action, the value from source promise and fulfills the + * Accesses the value from source promise and calls the consumer, then fulfills the * destination promise. */ private class ConsumeAction implements Runnable { @@ -166,8 +166,8 @@ public class Promise extends PromiseSupport { } /** - * A function action provides transformation function, value from source promise and fulfills the - * destination promise with the transformed value. + * Accesses the value from source promise, then fulfills the destination promise using the + * transformed value. The source value is transformed using the transformation function. */ private class TransformAction implements Runnable { @@ -184,8 +184,7 @@ public class Promise extends PromiseSupport { @Override public void run() { try { - V result = func.apply(src.get()); - dest.fulfill(result); + dest.fulfill(func.apply(src.get())); } catch (Throwable throwable) { dest.fulfillExceptionally((Exception) throwable.getCause()); }