what-the-bank/sources/io/grpc/stub/ClientCalls.java

672 lines
27 KiB
Java

package io.grpc.stub;
import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.AbstractFuture;
import com.google.common.util.concurrent.ListenableFuture;
import io.grpc.CallOptions;
import io.grpc.Channel;
import io.grpc.ClientCall;
import io.grpc.Metadata;
import io.grpc.MethodDescriptor;
import io.grpc.Status;
import io.grpc.StatusException;
import io.grpc.StatusRuntimeException;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Future;
import java.util.concurrent.locks.LockSupport;
import java.util.logging.Level;
import java.util.logging.Logger;
/* loaded from: classes6.dex */
public final class ClientCalls {
static final boolean $assertionsDisabled = false;
private static final Logger logger = Logger.getLogger(ClientCalls.class.getName());
static final CallOptions.Key<StubType> STUB_TYPE_OPTION = CallOptions.Key.create("internal-stub-type");
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public enum StubType {
BLOCKING,
FUTURE,
ASYNC
}
private ClientCalls() {
}
public static <ReqT, RespT> void asyncUnaryCall(ClientCall<ReqT, RespT> clientCall, ReqT reqt, StreamObserver<RespT> streamObserver) {
asyncUnaryRequestCall(clientCall, reqt, streamObserver, false);
}
public static <ReqT, RespT> void asyncServerStreamingCall(ClientCall<ReqT, RespT> clientCall, ReqT reqt, StreamObserver<RespT> streamObserver) {
asyncUnaryRequestCall(clientCall, reqt, streamObserver, true);
}
public static <ReqT, RespT> StreamObserver<ReqT> asyncClientStreamingCall(ClientCall<ReqT, RespT> clientCall, StreamObserver<RespT> streamObserver) {
return asyncStreamingRequestCall(clientCall, streamObserver, false);
}
public static <ReqT, RespT> StreamObserver<ReqT> asyncBidiStreamingCall(ClientCall<ReqT, RespT> clientCall, StreamObserver<RespT> streamObserver) {
return asyncStreamingRequestCall(clientCall, streamObserver, true);
}
public static <ReqT, RespT> RespT blockingUnaryCall(ClientCall<ReqT, RespT> clientCall, ReqT reqt) {
try {
return (RespT) getUnchecked(futureUnaryCall(clientCall, reqt));
} catch (Error e) {
throw cancelThrow(clientCall, e);
} catch (RuntimeException e2) {
throw cancelThrow(clientCall, e2);
}
}
/* JADX WARN: Multi-variable type inference failed */
/* JADX WARN: Removed duplicated region for block: B:27:0x0058 */
/* JADX WARN: Type inference failed for: r6v3 */
/* JADX WARN: Type inference failed for: r6v4 */
/* JADX WARN: Type inference failed for: r6v6 */
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct add '--show-bad-code' argument
*/
public static <ReqT, RespT> RespT blockingUnaryCall(io.grpc.Channel r3, io.grpc.MethodDescriptor<ReqT, RespT> r4, io.grpc.CallOptions r5, ReqT r6) {
/*
io.grpc.stub.ClientCalls$ThreadlessExecutor r0 = new io.grpc.stub.ClientCalls$ThreadlessExecutor
r0.<init>()
io.grpc.CallOptions$Key<io.grpc.stub.ClientCalls$StubType> r1 = io.grpc.stub.ClientCalls.STUB_TYPE_OPTION
io.grpc.stub.ClientCalls$StubType r2 = io.grpc.stub.ClientCalls.StubType.BLOCKING
io.grpc.CallOptions r5 = r5.withOption(r1, r2)
io.grpc.CallOptions r5 = r5.withExecutor(r0)
io.grpc.ClientCall r3 = r3.newCall(r4, r5)
r4 = 0
com.google.common.util.concurrent.ListenableFuture r5 = futureUnaryCall(r3, r6) // Catch: java.lang.Throwable -> L41 java.lang.Error -> L43 java.lang.RuntimeException -> L4b
L1a:
boolean r6 = r5.isDone() // Catch: java.lang.Throwable -> L41 java.lang.Error -> L43 java.lang.RuntimeException -> L4b
if (r6 != 0) goto L33
r0.waitAndDrain() // Catch: java.lang.InterruptedException -> L24 java.lang.Throwable -> L41 java.lang.Error -> L43 java.lang.RuntimeException -> L4b
goto L1a
L24:
r4 = move-exception
r6 = 1
java.lang.String r1 = "Thread interrupted"
r3.cancel(r1, r4) // Catch: java.lang.Throwable -> L2d java.lang.Error -> L2f java.lang.RuntimeException -> L31
r4 = r6
goto L1a
L2d:
r3 = move-exception
goto L56
L2f:
r4 = move-exception
goto L46
L31:
r4 = move-exception
goto L4e
L33:
java.lang.Object r3 = getUnchecked(r5) // Catch: java.lang.Throwable -> L41 java.lang.Error -> L43 java.lang.RuntimeException -> L4b
if (r4 == 0) goto L40
java.lang.Thread r4 = java.lang.Thread.currentThread()
r4.interrupt()
L40:
return r3
L41:
r3 = move-exception
goto L55
L43:
r5 = move-exception
r6 = r4
r4 = r5
L46:
java.lang.RuntimeException r3 = cancelThrow(r3, r4) // Catch: java.lang.Throwable -> L53
throw r3 // Catch: java.lang.Throwable -> L53
L4b:
r5 = move-exception
r6 = r4
r4 = r5
L4e:
java.lang.RuntimeException r3 = cancelThrow(r3, r4) // Catch: java.lang.Throwable -> L53
throw r3 // Catch: java.lang.Throwable -> L53
L53:
r3 = move-exception
r4 = r6
L55:
r6 = r4
L56:
if (r6 == 0) goto L5f
java.lang.Thread r4 = java.lang.Thread.currentThread()
r4.interrupt()
L5f:
throw r3
*/
throw new UnsupportedOperationException("Method not decompiled: io.grpc.stub.ClientCalls.blockingUnaryCall(io.grpc.Channel, io.grpc.MethodDescriptor, io.grpc.CallOptions, java.lang.Object):java.lang.Object");
}
public static <ReqT, RespT> Iterator<RespT> blockingServerStreamingCall(ClientCall<ReqT, RespT> clientCall, ReqT reqt) {
BlockingResponseStream blockingResponseStream = new BlockingResponseStream(clientCall);
asyncUnaryRequestCall(clientCall, reqt, blockingResponseStream.listener());
return blockingResponseStream;
}
public static <ReqT, RespT> Iterator<RespT> blockingServerStreamingCall(Channel channel, MethodDescriptor<ReqT, RespT> methodDescriptor, CallOptions callOptions, ReqT reqt) {
ThreadlessExecutor threadlessExecutor = new ThreadlessExecutor();
ClientCall newCall = channel.newCall(methodDescriptor, callOptions.withOption(STUB_TYPE_OPTION, StubType.BLOCKING).withExecutor(threadlessExecutor));
BlockingResponseStream blockingResponseStream = new BlockingResponseStream(newCall, threadlessExecutor);
asyncUnaryRequestCall(newCall, reqt, blockingResponseStream.listener());
return blockingResponseStream;
}
public static <ReqT, RespT> ListenableFuture<RespT> futureUnaryCall(ClientCall<ReqT, RespT> clientCall, ReqT reqt) {
GrpcFuture grpcFuture = new GrpcFuture(clientCall);
asyncUnaryRequestCall(clientCall, reqt, new UnaryStreamToFuture(grpcFuture));
return grpcFuture;
}
private static <V> V getUnchecked(Future<V> future) {
try {
return future.get();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw Status.CANCELLED.withDescription("Thread interrupted").withCause(e).asRuntimeException();
} catch (ExecutionException e2) {
throw toStatusRuntimeException(e2.getCause());
}
}
private static StatusRuntimeException toStatusRuntimeException(Throwable th) {
for (Throwable th2 = (Throwable) Preconditions.checkNotNull(th, "t"); th2 != null; th2 = th2.getCause()) {
if (th2 instanceof StatusException) {
StatusException statusException = (StatusException) th2;
return new StatusRuntimeException(statusException.getStatus(), statusException.getTrailers());
}
if (th2 instanceof StatusRuntimeException) {
StatusRuntimeException statusRuntimeException = (StatusRuntimeException) th2;
return new StatusRuntimeException(statusRuntimeException.getStatus(), statusRuntimeException.getTrailers());
}
}
return Status.UNKNOWN.withDescription("unexpected exception").withCause(th).asRuntimeException();
}
private static RuntimeException cancelThrow(ClientCall<?, ?> clientCall, Throwable th) {
try {
clientCall.cancel(null, th);
} catch (Throwable th2) {
logger.log(Level.SEVERE, "RuntimeException encountered while closing call", th2);
}
if (th instanceof RuntimeException) {
throw ((RuntimeException) th);
}
if (th instanceof Error) {
throw ((Error) th);
}
throw new AssertionError(th);
}
private static <ReqT, RespT> void asyncUnaryRequestCall(ClientCall<ReqT, RespT> clientCall, ReqT reqt, StreamObserver<RespT> streamObserver, boolean z) {
asyncUnaryRequestCall(clientCall, reqt, new StreamObserverToCallListenerAdapter(streamObserver, new CallToStreamObserverAdapter(clientCall, z)));
}
private static <ReqT, RespT> void asyncUnaryRequestCall(ClientCall<ReqT, RespT> clientCall, ReqT reqt, StartableListener<RespT> startableListener) {
startCall(clientCall, startableListener);
try {
clientCall.sendMessage(reqt);
clientCall.halfClose();
} catch (Error e) {
throw cancelThrow(clientCall, e);
} catch (RuntimeException e2) {
throw cancelThrow(clientCall, e2);
}
}
private static <ReqT, RespT> StreamObserver<ReqT> asyncStreamingRequestCall(ClientCall<ReqT, RespT> clientCall, StreamObserver<RespT> streamObserver, boolean z) {
CallToStreamObserverAdapter callToStreamObserverAdapter = new CallToStreamObserverAdapter(clientCall, z);
startCall(clientCall, new StreamObserverToCallListenerAdapter(streamObserver, callToStreamObserverAdapter));
return callToStreamObserverAdapter;
}
private static <ReqT, RespT> void startCall(ClientCall<ReqT, RespT> clientCall, StartableListener<RespT> startableListener) {
clientCall.start(startableListener, new Metadata());
startableListener.onStart();
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public static abstract class StartableListener<T> extends ClientCall.Listener<T> {
abstract void onStart();
private StartableListener() {
}
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public static final class CallToStreamObserverAdapter<ReqT> extends ClientCallStreamObserver<ReqT> {
private final ClientCall<ReqT, ?> call;
private boolean frozen;
private Runnable onReadyHandler;
private final boolean streamingResponse;
private int initialRequest = 1;
private boolean autoRequestEnabled = true;
private boolean aborted = false;
private boolean completed = false;
CallToStreamObserverAdapter(ClientCall<ReqT, ?> clientCall, boolean z) {
this.call = clientCall;
this.streamingResponse = z;
}
@Override // io.grpc.stub.StreamObserver
public final void onNext(ReqT reqt) {
Preconditions.checkState(!this.aborted, "Stream was terminated by error, no further calls are allowed");
Preconditions.checkState(!this.completed, "Stream is already completed, no further calls are allowed");
this.call.sendMessage(reqt);
}
@Override // io.grpc.stub.StreamObserver
public final void onError(Throwable th) {
this.call.cancel("Cancelled by client with StreamObserver.onError()", th);
this.aborted = true;
}
@Override // io.grpc.stub.StreamObserver
public final void onCompleted() {
this.call.halfClose();
this.completed = true;
}
@Override // io.grpc.stub.ClientCallStreamObserver, io.grpc.stub.CallStreamObserver
public final boolean isReady() {
return this.call.isReady();
}
@Override // io.grpc.stub.ClientCallStreamObserver, io.grpc.stub.CallStreamObserver
public final void setOnReadyHandler(Runnable runnable) {
if (this.frozen) {
throw new IllegalStateException("Cannot alter onReadyHandler after call started. Use ClientResponseObserver");
}
this.onReadyHandler = runnable;
}
@Override // io.grpc.stub.CallStreamObserver
@Deprecated
public final void disableAutoInboundFlowControl() {
disableAutoRequestWithInitial(1);
}
@Override // io.grpc.stub.ClientCallStreamObserver
public final void disableAutoRequestWithInitial(int i) {
if (this.frozen) {
throw new IllegalStateException("Cannot disable auto flow control after call started. Use ClientResponseObserver");
}
Preconditions.checkArgument(i >= 0, "Initial requests must be non-negative");
this.initialRequest = i;
this.autoRequestEnabled = false;
}
@Override // io.grpc.stub.ClientCallStreamObserver, io.grpc.stub.CallStreamObserver
public final void request(int i) {
if (!this.streamingResponse && i == 1) {
this.call.request(2);
} else {
this.call.request(i);
}
}
@Override // io.grpc.stub.ClientCallStreamObserver, io.grpc.stub.CallStreamObserver
public final void setMessageCompression(boolean z) {
this.call.setMessageCompression(z);
}
@Override // io.grpc.stub.ClientCallStreamObserver
public final void cancel(String str, Throwable th) {
this.call.cancel(str, th);
}
/* JADX INFO: Access modifiers changed from: private */
public void freeze() {
this.frozen = true;
}
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public static final class StreamObserverToCallListenerAdapter<ReqT, RespT> extends StartableListener<RespT> {
private final CallToStreamObserverAdapter<ReqT> adapter;
private boolean firstResponseReceived;
private final StreamObserver<RespT> observer;
@Override // io.grpc.ClientCall.Listener
public final void onHeaders(Metadata metadata) {
}
StreamObserverToCallListenerAdapter(StreamObserver<RespT> streamObserver, CallToStreamObserverAdapter<ReqT> callToStreamObserverAdapter) {
super();
this.observer = streamObserver;
this.adapter = callToStreamObserverAdapter;
if (streamObserver instanceof ClientResponseObserver) {
((ClientResponseObserver) streamObserver).beforeStart(callToStreamObserverAdapter);
}
callToStreamObserverAdapter.freeze();
}
@Override // io.grpc.ClientCall.Listener
public final void onMessage(RespT respt) {
if (this.firstResponseReceived && !((CallToStreamObserverAdapter) this.adapter).streamingResponse) {
throw Status.INTERNAL.withDescription("More than one responses received for unary or client-streaming call").asRuntimeException();
}
this.firstResponseReceived = true;
this.observer.onNext(respt);
if (((CallToStreamObserverAdapter) this.adapter).streamingResponse && ((CallToStreamObserverAdapter) this.adapter).autoRequestEnabled) {
this.adapter.request(1);
}
}
@Override // io.grpc.ClientCall.Listener
public final void onClose(Status status, Metadata metadata) {
if (status.isOk()) {
this.observer.onCompleted();
} else {
this.observer.onError(status.asRuntimeException(metadata));
}
}
@Override // io.grpc.ClientCall.Listener
public final void onReady() {
if (((CallToStreamObserverAdapter) this.adapter).onReadyHandler != null) {
((CallToStreamObserverAdapter) this.adapter).onReadyHandler.run();
}
}
@Override // io.grpc.stub.ClientCalls.StartableListener
final void onStart() {
if (((CallToStreamObserverAdapter) this.adapter).initialRequest > 0) {
CallToStreamObserverAdapter<ReqT> callToStreamObserverAdapter = this.adapter;
callToStreamObserverAdapter.request(((CallToStreamObserverAdapter) callToStreamObserverAdapter).initialRequest);
}
}
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public static final class UnaryStreamToFuture<RespT> extends StartableListener<RespT> {
private final GrpcFuture<RespT> responseFuture;
private RespT value;
@Override // io.grpc.ClientCall.Listener
public final void onHeaders(Metadata metadata) {
}
UnaryStreamToFuture(GrpcFuture<RespT> grpcFuture) {
super();
this.responseFuture = grpcFuture;
}
@Override // io.grpc.ClientCall.Listener
public final void onMessage(RespT respt) {
if (this.value != null) {
throw Status.INTERNAL.withDescription("More than one value received for unary call").asRuntimeException();
}
this.value = respt;
}
@Override // io.grpc.ClientCall.Listener
public final void onClose(Status status, Metadata metadata) {
if (status.isOk()) {
if (this.value == null) {
this.responseFuture.setException(Status.INTERNAL.withDescription("No value received for unary call").asRuntimeException(metadata));
}
this.responseFuture.set(this.value);
return;
}
this.responseFuture.setException(status.asRuntimeException(metadata));
}
@Override // io.grpc.stub.ClientCalls.StartableListener
final void onStart() {
((GrpcFuture) this.responseFuture).call.request(2);
}
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public static final class GrpcFuture<RespT> extends AbstractFuture<RespT> {
private final ClientCall<?, RespT> call;
GrpcFuture(ClientCall<?, RespT> clientCall) {
this.call = clientCall;
}
@Override // com.google.common.util.concurrent.AbstractFuture
public final void interruptTask() {
this.call.cancel("GrpcFuture was cancelled", null);
}
@Override // com.google.common.util.concurrent.AbstractFuture
public final boolean set(RespT respt) {
return super.set(respt);
}
@Override // com.google.common.util.concurrent.AbstractFuture
public final boolean setException(Throwable th) {
return super.setException(th);
}
@Override // com.google.common.util.concurrent.AbstractFuture
public final String pendingToString() {
return MoreObjects.toStringHelper(this).add("clientCall", this.call).toString();
}
}
/* loaded from: classes6.dex */
static final class BlockingResponseStream<T> implements Iterator<T> {
private final BlockingQueue<Object> buffer;
private final ClientCall<?, T> call;
private Object last;
private final StartableListener<T> listener;
private final ThreadlessExecutor threadless;
BlockingResponseStream(ClientCall<?, T> clientCall) {
this(clientCall, null);
}
BlockingResponseStream(ClientCall<?, T> clientCall, ThreadlessExecutor threadlessExecutor) {
this.buffer = new ArrayBlockingQueue(3);
this.listener = new QueuingListener(this);
this.call = clientCall;
this.threadless = threadlessExecutor;
}
private Object waitForNext() {
boolean z;
Throwable th;
Object take;
Object poll;
boolean z2 = false;
try {
z = true;
try {
if (this.threadless == null) {
while (true) {
try {
take = this.buffer.take();
break;
} catch (InterruptedException e) {
this.call.cancel("Thread interrupted", e);
z2 = true;
}
}
if (z2) {
Thread.currentThread().interrupt();
}
return take;
}
while (true) {
poll = this.buffer.poll();
if (poll != null) {
break;
}
try {
this.threadless.waitAndDrain();
} catch (InterruptedException e2) {
this.call.cancel("Thread interrupted", e2);
z2 = true;
}
}
if (z2) {
Thread.currentThread().interrupt();
}
return poll;
} catch (Throwable th2) {
th = th2;
}
th = th2;
} catch (Throwable th3) {
z = false;
th = th3;
}
if (z) {
Thread.currentThread().interrupt();
}
throw th;
}
@Override // java.util.Iterator
public final boolean hasNext() {
Object obj;
while (true) {
obj = this.last;
if (obj != null) {
break;
}
this.last = waitForNext();
}
if (!(obj instanceof StatusRuntimeException)) {
return obj != this;
}
StatusRuntimeException statusRuntimeException = (StatusRuntimeException) obj;
throw statusRuntimeException.getStatus().asRuntimeException(statusRuntimeException.getTrailers());
}
@Override // java.util.Iterator
public final T next() {
Object obj = this.last;
if (!(obj instanceof StatusRuntimeException) && obj != this) {
this.call.request(1);
}
if (!hasNext()) {
throw new NoSuchElementException();
}
T t = (T) this.last;
this.last = null;
return t;
}
@Override // java.util.Iterator
public final void remove() {
throw new UnsupportedOperationException();
}
/* loaded from: classes6.dex */
final class QueuingListener extends StartableListener<T> {
private boolean done;
final BlockingResponseStream this$0;
@Override // io.grpc.ClientCall.Listener
public final void onHeaders(Metadata metadata) {
}
/* JADX WARN: 'super' call moved to the top of the method (can break code semantics) */
QueuingListener(BlockingResponseStream blockingResponseStream) {
super();
this.this$0 = blockingResponseStream;
this.done = false;
}
@Override // io.grpc.ClientCall.Listener
public final void onMessage(T t) {
Preconditions.checkState(!this.done, "ClientCall already closed");
this.this$0.buffer.add(t);
}
@Override // io.grpc.ClientCall.Listener
public final void onClose(Status status, Metadata metadata) {
Preconditions.checkState(!this.done, "ClientCall already closed");
if (status.isOk()) {
this.this$0.buffer.add(this.this$0);
} else {
this.this$0.buffer.add(status.asRuntimeException(metadata));
}
this.done = true;
}
@Override // io.grpc.stub.ClientCalls.StartableListener
final void onStart() {
this.this$0.call.request(1);
}
}
final StartableListener<T> listener() {
return this.listener;
}
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public static final class ThreadlessExecutor extends ConcurrentLinkedQueue<Runnable> implements Executor {
private static final Logger log = Logger.getLogger(ThreadlessExecutor.class.getName());
private volatile Thread waiter;
ThreadlessExecutor() {
}
public final void waitAndDrain() throws InterruptedException {
Runnable poll;
throwIfInterrupted();
Runnable poll2 = poll();
if (poll2 == null) {
this.waiter = Thread.currentThread();
while (true) {
try {
poll = poll();
if (poll != null) {
break;
}
LockSupport.park(this);
throwIfInterrupted();
} catch (Throwable th) {
this.waiter = null;
throw th;
}
}
this.waiter = null;
poll2 = poll;
}
do {
try {
poll2.run();
} catch (Throwable th2) {
log.log(Level.WARNING, "Runnable threw exception", th2);
}
poll2 = poll();
} while (poll2 != null);
}
private static void throwIfInterrupted() throws InterruptedException {
if (Thread.interrupted()) {
throw new InterruptedException();
}
}
@Override // java.util.concurrent.Executor
public final void execute(Runnable runnable) {
add(runnable);
LockSupport.unpark(this.waiter);
}
}
}