From 09ba5ca656dd17ac5c2d518452ad5f89df388e57 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Fri, 22 Jul 2016 18:34:05 +0530 Subject: [PATCH] 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;