Skip to content

Commit

Permalink
Accept AutoCloseable in the Android copy of ClosingFuture, too.
Browse files Browse the repository at this point in the history
[`AutoCloseable`](https://developer.android.com/reference/java/lang/AutoCloseable) was added in API Level 19, so we can rely on it.

RELNOTES=n/a
PiperOrigin-RevId: 631389672
  • Loading branch information
cpovirk authored and Google Java Core Libraries committed May 7, 2024
1 parent 8f212ba commit 381835d
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,23 @@ public ClosingFuture<Object> call(DeferredCloser closer) throws Exception {
assertClosed(closeable1, closeable2);
}

public void testAutoCloseable() throws Exception {
AutoCloseable autoCloseable = closeable1::close;
ClosingFuture<String> closingFuture =
ClosingFuture.submit(
new ClosingCallable<String>() {
@Override
public String call(DeferredCloser closer) throws Exception {
closer.eventuallyClose(autoCloseable, closingExecutor);
return "foo";
}
},
executor);
assertThat(getFinalValue(closingFuture)).isEqualTo("foo");
waitUntilClosed(closingFuture);
assertClosed(closeable1);
}

public void testStatusFuture() throws Exception {
ClosingFuture<String> closingFuture =
ClosingFuture.submit(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,7 @@ public static final class DeferredCloser {
*/
@CanIgnoreReturnValue
@ParametricNullness
// TODO(b/163345357): Widen bound to AutoCloseable once we require API Level 19.
public <C extends @Nullable Object & @Nullable Closeable> C eventuallyClose(
public <C extends @Nullable Object & @Nullable AutoCloseable> C eventuallyClose(
@ParametricNullness C closeable, Executor closingExecutor) {
checkNotNull(closingExecutor);
if (closeable != null) {
Expand Down Expand Up @@ -431,17 +430,16 @@ public interface ValueAndCloserConsumer<V extends @Nullable Object> {
* ClosingFuture#from}.
*/
@Deprecated
// TODO(b/163345357): Widen bound to AutoCloseable once we require API Level 19.
public static <C extends @Nullable Object & @Nullable Closeable>
public static <C extends @Nullable Object & @Nullable AutoCloseable>
ClosingFuture<C> eventuallyClosing(
ListenableFuture<C> future, final Executor closingExecutor) {
checkNotNull(closingExecutor);
final ClosingFuture<C> closingFuture = new ClosingFuture<>(nonCancellationPropagating(future));
Futures.addCallback(
future,
new FutureCallback<@Nullable Closeable>() {
new FutureCallback<@Nullable AutoCloseable>() {
@Override
public void onSuccess(@CheckForNull Closeable result) {
public void onSuccess(@CheckForNull AutoCloseable result) {
closingFuture.closeables.closer.eventuallyClose(result, closingExecutor);
}

Expand Down Expand Up @@ -2136,7 +2134,7 @@ protected void finalize() {
}
}

private static void closeQuietly(@CheckForNull final Closeable closeable, Executor executor) {
private static void closeQuietly(@CheckForNull final AutoCloseable closeable, Executor executor) {
if (closeable == null) {
return;
}
Expand Down Expand Up @@ -2184,7 +2182,7 @@ private boolean compareAndUpdateState(State oldState, State newState) {
}

// TODO(dpb): Should we use a pair of ArrayLists instead of an IdentityHashMap?
private static final class CloseableList extends IdentityHashMap<Closeable, Executor>
private static final class CloseableList extends IdentityHashMap<AutoCloseable, Executor>
implements Closeable {
private final DeferredCloser closer = new DeferredCloser(this);
private volatile boolean closed;
Expand Down Expand Up @@ -2229,7 +2227,7 @@ public void close() {
}
closed = true;
}
for (Map.Entry<Closeable, Executor> entry : entrySet()) {
for (Map.Entry<AutoCloseable, Executor> entry : entrySet()) {
closeQuietly(entry.getKey(), entry.getValue());
}
clear();
Expand All @@ -2238,7 +2236,7 @@ public void close() {
}
}

void add(@CheckForNull Closeable closeable, Executor executor) {
void add(@CheckForNull AutoCloseable closeable, Executor executor) {
checkNotNull(executor);
if (closeable == null) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -347,11 +347,11 @@ public void testAutoCloseable() throws Exception {
@Override
public String call(DeferredCloser closer) throws Exception {
closer.eventuallyClose(autoCloseable, closingExecutor);
return "";
return "foo";
}
},
executor);
assertThat(getFinalValue(closingFuture)).isEqualTo("");
assertThat(getFinalValue(closingFuture)).isEqualTo("foo");
waitUntilClosed(closingFuture);
assertClosed(closeable1);
}
Expand Down

0 comments on commit 381835d

Please sign in to comment.