Skip to content
This repository was archived by the owner on Sep 26, 2023. It is now read-only.

Commit d8c0686

Browse files
authored
Make OperationFutureImpl support ApiFutures.catching() (#527)
* Make OperationFutureImpl support ApiFutures.catching()
1 parent a9aef28 commit d8c0686

File tree

4 files changed

+37
-3
lines changed

4 files changed

+37
-3
lines changed

gax/src/main/java/com/google/api/gax/longrunning/OperationFuture.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ public interface OperationFuture<ResponseT, MetadataT> extends ApiFuture<Respons
5555
*/
5656
ApiFuture<OperationSnapshot> getInitialFuture();
5757

58+
/** Returns the {@link RetryingFuture} which continues to poll {@link OperationSnapshot}. */
59+
RetryingFuture<OperationSnapshot> getPollingFuture();
60+
5861
/**
5962
* Peeks at the metadata of the operation tracked by this {@link OperationFuture}. If the initial
6063
* future hasn't completed yet this method returns {@code null}, otherwise it returns the latest

gax/src/main/java/com/google/api/gax/longrunning/OperationFutureImpl.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,22 @@ public OperationFutureImpl(
8181
this.metadataTransformer = checkNotNull(metadataTransformer);
8282
}
8383

84+
public OperationFutureImpl(
85+
RetryingFuture<OperationSnapshot> pollingFuture,
86+
ApiFuture<OperationSnapshot> initialFuture,
87+
ApiFunction<OperationSnapshot, ResponseT> responseTransformer,
88+
ApiFunction<OperationSnapshot, MetadataT> metadataTransformer,
89+
ApiFunction<Exception, ResponseT> exceptionTransformer) {
90+
this.pollingFuture = checkNotNull(pollingFuture);
91+
this.initialFuture = checkNotNull(initialFuture);
92+
this.resultFuture =
93+
ApiFutures.catching(
94+
ApiFutures.transform(pollingFuture, responseTransformer),
95+
Exception.class,
96+
exceptionTransformer);
97+
this.metadataTransformer = checkNotNull(metadataTransformer);
98+
}
99+
84100
@Override
85101
public void addListener(Runnable listener, Executor executor) {
86102
pollingFuture.addListener(listener, executor);
@@ -103,15 +119,13 @@ public boolean isDone() {
103119

104120
@Override
105121
public ResponseT get() throws InterruptedException, ExecutionException {
106-
pollingFuture.get();
107122
return resultFuture.get();
108123
}
109124

110125
@Override
111126
public ResponseT get(long timeout, TimeUnit unit)
112127
throws InterruptedException, ExecutionException, TimeoutException {
113-
pollingFuture.get(timeout, unit);
114-
return resultFuture.get();
128+
return resultFuture.get(timeout, unit);
115129
}
116130

117131
@Override
@@ -124,6 +138,11 @@ public ApiFuture<OperationSnapshot> getInitialFuture() {
124138
return initialFuture;
125139
}
126140

141+
@Override
142+
public RetryingFuture<OperationSnapshot> getPollingFuture() {
143+
return pollingFuture;
144+
}
145+
127146
// Note, the following two methods are not duplicates of each other even though code checking
128147
// tools may indicate so. They assign multiple different class fields.
129148
@Override

gax/src/main/java/com/google/api/gax/longrunning/OperationFutures.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.google.api.core.ApiFuture;
3333
import com.google.api.core.ApiFutures;
3434
import com.google.api.core.BetaApi;
35+
import com.google.api.gax.retrying.RetryingFuture;
3536
import com.google.api.gax.rpc.ApiException;
3637
import com.google.api.gax.rpc.StatusCode;
3738
import com.google.common.base.Preconditions;
@@ -85,6 +86,11 @@ public ApiFuture<OperationSnapshot> getInitialFuture() {
8586
return initialFuture;
8687
}
8788

89+
@Override
90+
public RetryingFuture<OperationSnapshot> getPollingFuture() {
91+
throw new UnsupportedOperationException("Not implemented: getPollingFuture().");
92+
}
93+
8894
@Override
8995
public void addListener(Runnable runnable, Executor executor) {
9096
initialFuture.addListener(runnable, executor);

gax/src/test/java/com/google/api/gax/rpc/testing/FakeOperationApi.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.google.api.core.InternalApi;
3636
import com.google.api.gax.longrunning.OperationFuture;
3737
import com.google.api.gax.longrunning.OperationSnapshot;
38+
import com.google.api.gax.retrying.RetryingFuture;
3839
import com.google.api.gax.rpc.ApiCallContext;
3940
import com.google.api.gax.rpc.OperationCallable;
4041
import java.util.HashMap;
@@ -126,6 +127,11 @@ public ApiFuture<OperationSnapshot> getInitialFuture() {
126127
throw new UnsupportedOperationException("getInitialFuture() not implemented");
127128
}
128129

130+
@Override
131+
public RetryingFuture<OperationSnapshot> getPollingFuture() {
132+
throw new UnsupportedOperationException("getPollingFuture() not implemented");
133+
}
134+
129135
@Override
130136
public ApiFuture<Long> peekMetadata() {
131137
return null;

0 commit comments

Comments
 (0)