Skip to content

Commit 14b8759

Browse files
committed
Fix errors in decorators (unimplemented methods; wrong wrapping); Implementing raw() for onCancel result
1 parent 258726e commit 14b8759

File tree

5 files changed

+38
-31
lines changed

5 files changed

+38
-31
lines changed

src/main/java/net/tascalate/concurrent/ConfigurableDependentPromise.java

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@
7777
* a type of the successfully resolved promise value
7878
*/
7979
public class ConfigurableDependentPromise<T> implements DependentPromise<T> {
80-
final protected Promise<T> delegate;
81-
final protected CompletionStage<?>[] cancellableOrigins;
82-
final private Set<PromiseOrigin> defaultEnlistOptions;
80+
protected final Promise<T> delegate;
81+
protected final CompletionStage<?>[] cancellableOrigins;
82+
protected final Set<PromiseOrigin> defaultEnlistOptions;
8383

8484
protected ConfigurableDependentPromise(Promise<T> delegate,
8585
Set<PromiseOrigin> defaultEnlistOptions,
@@ -130,17 +130,7 @@ private static <U> DependentPromise<U> doWrap(Promise<U> original,
130130

131131
@Override
132132
public DependentPromise<T> onCancel(Runnable code) {
133-
return new ConfigurableDependentPromise<T>(this, defaultEnlistOptions, null) {
134-
@Override
135-
public boolean cancel(boolean mayInterruptIfRunning) {
136-
if (super.cancel(mayInterruptIfRunning)) {
137-
code.run();
138-
return true;
139-
} else {
140-
return false;
141-
}
142-
}
143-
};
133+
return new ExtraCancellationPromise<>(this, defaultEnlistOptions, code);
144134
}
145135

146136
// All delay overloads delegate to these methods
@@ -839,7 +829,6 @@ private static boolean identicalSets(Set<?> a, Set<?> b) {
839829
return a.containsAll(b) && b.containsAll(a);
840830
}
841831

842-
843832
static class UndecoratedCancellationPromise<T> extends AbstractPromiseDecorator<T, Promise<T>> {
844833
private final CompletionStage<?>[] dependent;
845834
UndecoratedCancellationPromise(Promise<T> original, CompletionStage<?>[] dependent) {
@@ -869,4 +858,32 @@ protected <U> Promise<U> wrap(CompletionStage<U> original) {
869858
return (Promise<U>)original;
870859
}
871860
}
861+
862+
static class ExtraCancellationPromise<T> extends ConfigurableDependentPromise<T> {
863+
private final Runnable code;
864+
public ExtraCancellationPromise(Promise<T> origin, Set<PromiseOrigin> enlistOptions, Runnable code) {
865+
super(origin, enlistOptions, null);
866+
this.code = code;
867+
}
868+
869+
@Override
870+
public boolean cancel(boolean mayInterruptIfRunning) {
871+
if (super.cancel(mayInterruptIfRunning)) {
872+
code.run();
873+
return true;
874+
} else {
875+
return false;
876+
}
877+
}
878+
879+
@Override
880+
public Promise<T> raw() {
881+
Promise<T> undecorated = super.raw();
882+
if (delegate == undecorated) {
883+
return this;
884+
} else {
885+
return new ExtraCancellationPromise<>(undecorated, defaultEnlistOptions, code);
886+
}
887+
}
888+
}
872889
}

src/main/java/net/tascalate/concurrent/decorators/AbstractDependentPromiseDecorator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ protected AbstractDependentPromiseDecorator(DependentPromise<T> delegate) {
4343

4444
@Override
4545
public DependentPromise<T> dependent() {
46-
DependentPromise<T> result = delegate.dependent();
46+
DependentPromise<T> result = super.dependent();
4747
if (result == delegate) {
4848
return this;
4949
} else {
@@ -53,7 +53,7 @@ public DependentPromise<T> dependent() {
5353

5454
@Override
5555
public DependentPromise<T> dependent(Set<PromiseOrigin> defaultEnlistOptions) {
56-
DependentPromise<T> result = delegate.dependent(defaultEnlistOptions);
56+
DependentPromise<T> result = super.dependent(defaultEnlistOptions);
5757
if (result == delegate) {
5858
return this;
5959
} else {

src/main/java/net/tascalate/concurrent/decorators/AbstractPromiseDecorator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@ public Promise<T> raw() {
7070

7171
@Override
7272
public DependentPromise<T> dependent() {
73-
throw new UnsupportedOperationException("Method must be re-implemented");
73+
return delegate.dependent();
7474
}
7575

7676
@Override
7777
public DependentPromise<T> dependent(Set<PromiseOrigin> defaultEnlistOptions) {
78-
throw new UnsupportedOperationException("Method must be re-implemented");
78+
return delegate.dependent(defaultEnlistOptions);
7979
}
8080

8181
@Override

src/main/java/net/tascalate/concurrent/decorators/ExecutorBoundDependentPromise.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,12 @@ protected <U> DependentPromise<U> wrap(CompletionStage<U> original) {
3939
return new ExecutorBoundDependentPromise<>((DependentPromise<U>)original, defaultExecutor);
4040
}
4141

42-
@Override
43-
public DependentPromise<T> dependent() {
44-
return new ExecutorBoundDependentPromise<>(super.dependent(), defaultExecutor);
45-
}
46-
47-
@Override
48-
public DependentPromise<T> dependent(Set<PromiseOrigin> defaultEnlistOptions) {
49-
return new ExecutorBoundDependentPromise<>(super.dependent(defaultEnlistOptions), defaultExecutor);
50-
}
51-
5242
@Override
5343
public DependentPromise<T> defaultAsyncOn(Executor executor) {
5444
if (executor == defaultExecutor) {
5545
return this;
5646
} else {
57-
return new ExecutorBoundDependentPromise<>(delegate, executor);
47+
return super.defaultAsyncOn(executor);
5848
}
5949
}
6050

src/main/java/net/tascalate/concurrent/decorators/ExecutorBoundPromise.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public Promise<T> defaultAsyncOn(Executor executor) {
5656
if (executor == defaultExecutor) {
5757
return this;
5858
} else {
59-
return new ExecutorBoundPromise<>(delegate, executor);
59+
return super.defaultAsyncOn(executor);
6060
}
6161
}
6262

0 commit comments

Comments
 (0)