1 /* 2 * Copyright 2017 Google LLC 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google LLC nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 package com.google.api.gax.grpc; 31 32 import com.google.api.core.BetaApi; 33 import com.google.api.gax.rpc.RequestParamsExtractor; 34 import io.grpc.MethodDescriptor; 35 36 /** Grpc-specific settings for creating callables. */ 37 public class GrpcCallSettings<RequestT, ResponseT> { 38 private final MethodDescriptor<RequestT, ResponseT> methodDescriptor; 39 private final RequestParamsExtractor<RequestT> paramsExtractor; 40 private final boolean alwaysAwaitTrailers; 41 GrpcCallSettings(Builder<RequestT, ResponseT> builder)42 private GrpcCallSettings(Builder<RequestT, ResponseT> builder) { 43 this.methodDescriptor = builder.methodDescriptor; 44 this.paramsExtractor = builder.paramsExtractor; 45 this.alwaysAwaitTrailers = builder.shouldAwaitTrailers; 46 } 47 getMethodDescriptor()48 public MethodDescriptor<RequestT, ResponseT> getMethodDescriptor() { 49 return methodDescriptor; 50 } 51 getParamsExtractor()52 public RequestParamsExtractor<RequestT> getParamsExtractor() { 53 return paramsExtractor; 54 } 55 56 @BetaApi shouldAwaitTrailers()57 public boolean shouldAwaitTrailers() { 58 return alwaysAwaitTrailers; 59 } 60 newBuilder()61 public static <RequestT, ResponseT> Builder<RequestT, ResponseT> newBuilder() { 62 return new Builder<RequestT, ResponseT>().setShouldAwaitTrailers(true); 63 } 64 create( MethodDescriptor<RequestT, ResponseT> methodDescriptor)65 public static <RequestT, ResponseT> GrpcCallSettings<RequestT, ResponseT> create( 66 MethodDescriptor<RequestT, ResponseT> methodDescriptor) { 67 return GrpcCallSettings.<RequestT, ResponseT>newBuilder() 68 .setMethodDescriptor(methodDescriptor) 69 .build(); 70 } 71 toBuilder()72 public Builder toBuilder() { 73 return new Builder<>(this); 74 } 75 76 public static class Builder<RequestT, ResponseT> { 77 private MethodDescriptor<RequestT, ResponseT> methodDescriptor; 78 private RequestParamsExtractor<RequestT> paramsExtractor; 79 private boolean shouldAwaitTrailers; 80 Builder()81 private Builder() {} 82 Builder(GrpcCallSettings<RequestT, ResponseT> settings)83 private Builder(GrpcCallSettings<RequestT, ResponseT> settings) { 84 this.methodDescriptor = settings.methodDescriptor; 85 this.paramsExtractor = settings.paramsExtractor; 86 this.shouldAwaitTrailers = settings.alwaysAwaitTrailers; 87 } 88 setMethodDescriptor( MethodDescriptor<RequestT, ResponseT> methodDescriptor)89 public Builder<RequestT, ResponseT> setMethodDescriptor( 90 MethodDescriptor<RequestT, ResponseT> methodDescriptor) { 91 this.methodDescriptor = methodDescriptor; 92 return this; 93 } 94 setParamsExtractor( RequestParamsExtractor<RequestT> paramsExtractor)95 public Builder<RequestT, ResponseT> setParamsExtractor( 96 RequestParamsExtractor<RequestT> paramsExtractor) { 97 this.paramsExtractor = paramsExtractor; 98 return this; 99 } 100 101 @BetaApi setShouldAwaitTrailers(boolean b)102 public Builder<RequestT, ResponseT> setShouldAwaitTrailers(boolean b) { 103 this.shouldAwaitTrailers = b; 104 return this; 105 } 106 build()107 public GrpcCallSettings<RequestT, ResponseT> build() { 108 return new GrpcCallSettings<>(this); 109 } 110 } 111 } 112