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

23 files changed

+468
-65
lines changed
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ public ResponseT apply(OperationSnapshot operationSnapshot) {
6565
operationSnapshot.getErrorCode(),
6666
false);
6767
}
68+
69+
if (!(operationSnapshot.getResponse() instanceof Any)) {
70+
return (ResponseT) operationSnapshot.getResponse();
71+
}
72+
6873
try {
6974
return transformer.apply((Any) operationSnapshot.getResponse());
7075
} catch (RuntimeException e) {
@@ -94,9 +99,11 @@ private MetadataTransformer(Class<MetadataT> packedClass) {
9499

95100
@Override
96101
public MetadataT apply(OperationSnapshot operationSnapshot) {
102+
if (!(operationSnapshot.getMetadata() instanceof Any)) {
103+
return (MetadataT) operationSnapshot.getMetadata();
104+
}
97105
try {
98-
return transformer.apply(
99-
operationSnapshot.getMetadata() != null ? (Any) operationSnapshot.getMetadata() : null);
106+
return transformer.apply((Any) operationSnapshot.getMetadata());
100107
} catch (RuntimeException e) {
101108
throw ApiExceptionFactory.createException(
102109
"Polling operation with name \""
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,8 @@
4848

4949
@RunWith(JUnit4.class)
5050
public class ProtoOperationTransformersTest {
51-
5251
@Test
53-
public void testResponseTransformer() {
52+
public void testAnyResponseTransformer() {
5453
ResponseTransformer<Money> transformer = ResponseTransformer.create(Money.class);
5554
Money inputMoney = Money.newBuilder().setCurrencyCode("USD").build();
5655
OperationSnapshot operationSnapshot =
@@ -60,7 +59,7 @@ public void testResponseTransformer() {
6059
}
6160

6261
@Test
63-
public void testResponseTransformer_exception() {
62+
public void testAnyResponseTransformer_exception() {
6463
ResponseTransformer<Money> transformer = ResponseTransformer.create(Money.class);
6564
Money inputMoney = Money.newBuilder().setCurrencyCode("USD").build();
6665
Status status = Status.newBuilder().setCode(Code.UNAVAILABLE.value()).build();
@@ -78,7 +77,7 @@ public void testResponseTransformer_exception() {
7877
}
7978

8079
@Test
81-
public void testResponseTransformer_mismatchedTypes() {
80+
public void testAnyResponseTransformer_mismatchedTypes() {
8281
ResponseTransformer<Money> transformer = ResponseTransformer.create(Money.class);
8382
Status status = Status.newBuilder().setCode(Code.OK.value()).build();
8483
OperationSnapshot operationSnapshot =
@@ -96,7 +95,7 @@ public void testResponseTransformer_mismatchedTypes() {
9695
}
9796

9897
@Test
99-
public void testMetadataTransformer() {
98+
public void testAnyMetadataTransformer() {
10099
MetadataTransformer<Money> transformer = MetadataTransformer.create(Money.class);
101100
Money inputMoney = Money.newBuilder().setCurrencyCode("USD").build();
102101
OperationSnapshot operationSnapshot =
@@ -106,7 +105,7 @@ public void testMetadataTransformer() {
106105
}
107106

108107
@Test
109-
public void testMetadataTransformer_mismatchedTypes() {
108+
public void testAnyMetadataTransformer_mismatchedTypes() {
110109
MetadataTransformer<Money> transformer = MetadataTransformer.create(Money.class);
111110
Status status = Status.newBuilder().setCode(Code.OK.value()).build();
112111
OperationSnapshot operationSnapshot =
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.google.gson.TypeAdapter;
3838
import com.google.gson.stream.JsonReader;
3939
import com.google.gson.stream.JsonWriter;
40+
import com.google.protobuf.TypeRegistry;
4041
import java.io.InputStream;
4142
import java.io.InputStreamReader;
4243
import java.lang.reflect.Type;
@@ -104,6 +105,11 @@ public ResponseT parse(InputStream httpResponseBody) {
104105
}
105106
}
106107

108+
@Override
109+
public ResponseT parse(InputStream httpResponseBody, TypeRegistry registry) {
110+
return parse(httpResponseBody);
111+
}
112+
107113
@Override
108114
public String serialize(ResponseT response) {
109115
return getResponseMarshaller().toJson(response);
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.google.api.core.BetaApi;
3333
import com.google.auth.Credentials;
3434
import com.google.auto.value.AutoValue;
35+
import com.google.protobuf.TypeRegistry;
3536
import javax.annotation.Nullable;
3637
import org.threeten.bp.Instant;
3738

@@ -45,6 +46,9 @@ public abstract class HttpJsonCallOptions {
4546
@Nullable
4647
public abstract Credentials getCredentials();
4748

49+
@Nullable
50+
public abstract TypeRegistry getTypeRegistry();
51+
4852
public static Builder newBuilder() {
4953
return new AutoValue_HttpJsonCallOptions.Builder();
5054
}
@@ -55,6 +59,8 @@ public abstract static class Builder {
5559

5660
public abstract Builder setCredentials(Credentials value);
5761

62+
public abstract Builder setTypeRegistry(TypeRegistry value);
63+
5864
public abstract HttpJsonCallOptions build();
5965
}
6066
}
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,27 @@
2929
*/
3030
package com.google.api.gax.httpjson;
3131

32+
import com.google.protobuf.TypeRegistry;
33+
3234
/** HTTP-specific settings for creating callables. */
3335
public class HttpJsonCallSettings<RequestT, ResponseT> {
3436
private final ApiMethodDescriptor<RequestT, ResponseT> methodDescriptor;
37+
private final TypeRegistry typeRegistry;
3538

36-
private HttpJsonCallSettings(ApiMethodDescriptor<RequestT, ResponseT> methodDescriptor) {
39+
private HttpJsonCallSettings(
40+
ApiMethodDescriptor<RequestT, ResponseT> methodDescriptor, TypeRegistry typeRegistry) {
3741
this.methodDescriptor = methodDescriptor;
42+
this.typeRegistry = typeRegistry;
3843
}
3944

4045
public ApiMethodDescriptor<RequestT, ResponseT> getMethodDescriptor() {
4146
return methodDescriptor;
4247
}
4348

49+
public TypeRegistry getTypeRegistry() {
50+
return typeRegistry;
51+
}
52+
4453
public static <RequestT, ResponseT> Builder<RequestT, ResponseT> newBuilder() {
4554
return new Builder<>();
4655
}
@@ -58,6 +67,7 @@ public Builder toBuilder() {
5867

5968
public static class Builder<RequestT, ResponseT> {
6069
private ApiMethodDescriptor<RequestT, ResponseT> methodDescriptor;
70+
private TypeRegistry typeRegistry;
6171

6272
private Builder() {}
6373

@@ -71,8 +81,13 @@ public Builder<RequestT, ResponseT> setMethodDescriptor(
7181
return this;
7282
}
7383

84+
public Builder<RequestT, ResponseT> setTypeRegistry(TypeRegistry typeRegistry) {
85+
this.typeRegistry = typeRegistry;
86+
return this;
87+
}
88+
7489
public HttpJsonCallSettings<RequestT, ResponseT> build() {
75-
return new HttpJsonCallSettings<>(methodDescriptor);
90+
return new HttpJsonCallSettings<>(methodDescriptor, typeRegistry);
7691
}
7792
}
7893
}
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ private HttpJsonCallableFactory() {}
6161
private static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createDirectUnaryCallable(
6262
HttpJsonCallSettings<RequestT, ResponseT> httpJsonCallSettings) {
6363
return new HttpJsonDirectCallable<RequestT, ResponseT>(
64-
httpJsonCallSettings.getMethodDescriptor());
64+
httpJsonCallSettings.getMethodDescriptor(), httpJsonCallSettings.getTypeRegistry());
6565
}
6666

6767
static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createUnaryCallable(
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.google.api.gax.rpc.ApiCallContext;
3434
import com.google.api.gax.rpc.UnaryCallable;
3535
import com.google.common.base.Preconditions;
36+
import com.google.protobuf.TypeRegistry;
3637
import javax.annotation.Nonnull;
3738
import javax.annotation.Nullable;
3839
import org.threeten.bp.Instant;
@@ -44,9 +45,16 @@
4445
*/
4546
class HttpJsonDirectCallable<RequestT, ResponseT> extends UnaryCallable<RequestT, ResponseT> {
4647
private final ApiMethodDescriptor<RequestT, ResponseT> descriptor;
48+
private final TypeRegistry typeRegistry;
4749

4850
HttpJsonDirectCallable(ApiMethodDescriptor<RequestT, ResponseT> descriptor) {
51+
this(descriptor, null);
52+
}
53+
54+
HttpJsonDirectCallable(
55+
ApiMethodDescriptor<RequestT, ResponseT> descriptor, TypeRegistry typeRegistry) {
4956
this.descriptor = descriptor;
57+
this.typeRegistry = typeRegistry;
5058
}
5159

5260
@Override
@@ -68,6 +76,7 @@ public ApiFuture<ResponseT> futureCall(RequestT request, ApiCallContext inputCon
6876
HttpJsonCallOptions.newBuilder()
6977
.setDeadline(deadline)
7078
.setCredentials(context.getCredentials())
79+
.setTypeRegistry(typeRegistry)
7180
.build();
7281
return context.getChannel().issueFutureUnaryCall(callOptions, request, descriptor);
7382
}
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import com.google.api.core.InternalApi;
3434
import com.google.api.gax.longrunning.OperationSnapshot;
3535
import com.google.api.gax.rpc.StatusCode;
36+
import com.google.api.gax.rpc.StatusCode.Code;
37+
import com.google.longrunning.Operation;
3638

3739
/**
3840
* Implementation of OperationSnapshot based on REST transport.
@@ -42,32 +44,26 @@
4244
@BetaApi("The surface for long-running operations is not stable yet and may change in the future.")
4345
@InternalApi
4446
public class HttpJsonOperationSnapshot implements OperationSnapshot {
45-
4647
private final String name;
4748
private final Object metadata;
4849
private final boolean done;
4950
private final Object response;
5051
private final StatusCode errorCode;
5152
private final String errorMessage;
5253

53-
public HttpJsonOperationSnapshot(
54+
private HttpJsonOperationSnapshot(
5455
String name,
5556
Object metadata,
5657
boolean done,
5758
Object response,
58-
int errorCode,
59+
StatusCode errorCode,
5960
String errorMessage) {
6061
this.name = name;
6162
this.metadata = metadata;
6263
this.done = done;
63-
this.response = done ? response : null;
64-
if (done && errorCode != 0) {
65-
this.errorCode = HttpJsonStatusCode.of(errorCode, errorMessage);
66-
this.errorMessage = errorMessage;
67-
} else {
68-
this.errorCode = null;
69-
this.errorMessage = null;
70-
}
64+
this.response = response;
65+
this.errorCode = errorCode;
66+
this.errorMessage = errorMessage;
7167
}
7268

7369
/** {@inheritDoc} */
@@ -106,6 +102,10 @@ public String getErrorMessage() {
106102
return this.errorMessage;
107103
}
108104

105+
public static HttpJsonOperationSnapshot create(Operation operation) {
106+
return newBuilder().setOperation(operation).build();
107+
}
108+
109109
public static Builder newBuilder() {
110110
return new HttpJsonOperationSnapshot.Builder();
111111
}
@@ -115,7 +115,7 @@ public static class Builder {
115115
private Object metadata;
116116
private boolean done;
117117
private Object response;
118-
private int errorCode;
118+
private StatusCode errorCode;
119119
private String errorMessage;
120120

121121
public Builder setName(String name) {
@@ -139,11 +139,24 @@ public Builder setResponse(Object response) {
139139
}
140140

141141
public Builder setError(int errorCode, String errorMessage) {
142-
this.errorCode = errorCode;
142+
this.errorCode =
143+
HttpJsonStatusCode.of(
144+
errorCode == 0 ? Code.OK.getHttpStatusCode() : errorCode, errorMessage);
143145
this.errorMessage = errorMessage;
144146
return this;
145147
}
146148

149+
private Builder setOperation(Operation operation) {
150+
this.name = operation.getName();
151+
this.done = operation.getDone();
152+
this.response = operation.getResponse();
153+
this.metadata = operation.getMetadata();
154+
this.errorCode =
155+
HttpJsonStatusCode.of(com.google.rpc.Code.forNumber(operation.getError().getCode()));
156+
this.errorMessage = operation.getError().getMessage();
157+
return this;
158+
}
159+
147160
public HttpJsonOperationSnapshot build() {
148161
return new HttpJsonOperationSnapshot(name, metadata, done, response, errorCode, errorMessage);
149162
}
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,51 @@ public static HttpJsonStatusCode of(StatusCode.Code statusCode) {
5757
return new HttpJsonStatusCode(statusCode.getHttpStatusCode(), statusCode);
5858
}
5959

60+
public static HttpJsonStatusCode of(com.google.rpc.Code rpcCode) {
61+
return new HttpJsonStatusCode(rpcCode.getNumber(), rpcCodeToStatusCode(rpcCode));
62+
}
63+
64+
static StatusCode.Code rpcCodeToStatusCode(com.google.rpc.Code rpcCode) {
65+
switch (rpcCode) {
66+
case OK:
67+
return Code.OK;
68+
case CANCELLED:
69+
return Code.CANCELLED;
70+
case UNKNOWN:
71+
return Code.UNKNOWN;
72+
case INVALID_ARGUMENT:
73+
return Code.INVALID_ARGUMENT;
74+
case DEADLINE_EXCEEDED:
75+
return Code.DEADLINE_EXCEEDED;
76+
case NOT_FOUND:
77+
return Code.DEADLINE_EXCEEDED;
78+
case ALREADY_EXISTS:
79+
return Code.ALREADY_EXISTS;
80+
case PERMISSION_DENIED:
81+
return Code.PERMISSION_DENIED;
82+
case RESOURCE_EXHAUSTED:
83+
return Code.RESOURCE_EXHAUSTED;
84+
case FAILED_PRECONDITION:
85+
return Code.FAILED_PRECONDITION;
86+
case ABORTED:
87+
return Code.ABORTED;
88+
case OUT_OF_RANGE:
89+
return Code.OUT_OF_RANGE;
90+
case UNIMPLEMENTED:
91+
return Code.UNIMPLEMENTED;
92+
case INTERNAL:
93+
return Code.INTERNAL;
94+
case UNAVAILABLE:
95+
return Code.UNAVAILABLE;
96+
case DATA_LOSS:
97+
return Code.DATA_LOSS;
98+
case UNAUTHENTICATED:
99+
return Code.UNAUTHENTICATED;
100+
default:
101+
throw new IllegalArgumentException("Unrecognized rpc code: " + rpcCode);
102+
}
103+
}
104+
60105
static StatusCode.Code httpStatusToStatusCode(int httpStatus, String errorMessage) {
61106
String causeMessage = Strings.nullToEmpty(errorMessage).toUpperCase();
62107
switch (httpStatus) {
@@ -143,4 +188,9 @@ public boolean equals(Object o) {
143188
public int hashCode() {
144189
return Objects.hash(statusCode);
145190
}
191+
192+
@Override
193+
public String toString() {
194+
return "HttpJsonStatusCode{" + "statusCode=" + statusCode + "}";
195+
}
146196
}
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,13 @@ public void run() {
195195
HttpJsonStatusCode.of(httpResponse.getStatusCode(), httpResponse.getStatusMessage()),
196196
false);
197197
}
198+
198199
if (getApiMethodDescriptor().getResponseParser() != null) {
199200
ResponseT response =
200-
getApiMethodDescriptor().getResponseParser().parse(httpResponse.getContent());
201+
getApiMethodDescriptor()
202+
.getResponseParser()
203+
.parse(httpResponse.getContent(), getHttpJsonCallOptions().getTypeRegistry());
204+
201205
getResponseFuture().set(response);
202206
} else {
203207
getResponseFuture().set(null);

0 commit comments

Comments
 (0)