1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.hc.core5.concurrent;
28
29 import java.util.concurrent.Future;
30 import java.util.concurrent.atomic.AtomicReference;
31
32 import org.apache.hc.core5.util.Args;
33
34
35
36
37
38
39
40
41
42 public final class ComplexFuture<T> extends BasicFuture<T> implements CancellableDependency {
43
44 private final AtomicReference<Cancellable> dependencyRef;
45
46 public ComplexFuture(final FutureCallback<T> callback) {
47 super(callback);
48 this.dependencyRef = new AtomicReference<>();
49 }
50
51 @Override
52 public void setDependency(final Cancellable dependency) {
53 Args.notNull(dependency, "dependency");
54 if (isDone()) {
55 dependency.cancel();
56 } else {
57 dependencyRef.set(dependency);
58 }
59 }
60
61 public void setDependency(final Future<?> dependency) {
62 Args.notNull(dependency, "dependency");
63 if (dependency instanceof Cancellable) {
64 setDependency((Cancellable) dependency);
65 } else {
66 setDependency(() -> dependency.cancel(true));
67 }
68 }
69
70 @Override
71 public boolean completed(final T result) {
72 final boolean completed = super.completed(result);
73 dependencyRef.set(null);
74 return completed;
75 }
76
77 @Override
78 public boolean failed(final Exception exception) {
79 final boolean failed = super.failed(exception);
80 dependencyRef.set(null);
81 return failed;
82 }
83
84 @Override
85 public boolean cancel(final boolean mayInterruptIfRunning) {
86 final boolean cancelled = super.cancel(mayInterruptIfRunning);
87 final Cancellable dependency = dependencyRef.getAndSet(null);
88 if (dependency != null) {
89 dependency.cancel();
90 }
91 return cancelled;
92 }
93
94 }