diff --git a/xds/src/main/java/io/grpc/xds/ForwardingServerBuilder.java b/xds/src/main/java/io/grpc/xds/ForwardingServerBuilder.java new file mode 100644 index 000000000000..a1d8cbafb478 --- /dev/null +++ b/xds/src/main/java/io/grpc/xds/ForwardingServerBuilder.java @@ -0,0 +1,177 @@ +/* + * Copyright 2020 The gRPC Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.grpc.xds; + +import com.google.common.base.MoreObjects; +import io.grpc.BinaryLog; +import io.grpc.BindableService; +import io.grpc.CompressorRegistry; +import io.grpc.DecompressorRegistry; +import io.grpc.HandlerRegistry; +import io.grpc.Server; +import io.grpc.ServerBuilder; +import io.grpc.ServerInterceptor; +import io.grpc.ServerServiceDefinition; +import io.grpc.ServerStreamTracer; +import io.grpc.ServerTransportFilter; +import java.io.File; +import java.io.InputStream; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; + +/** + * A {@link ServerBuilder} that delegates all its builder method to another builder by default. + * + * @param The type of the subclass extending this abstract class. + */ +abstract class ForwardingServerBuilder> extends ServerBuilder { + + /** The default constructor. */ + protected ForwardingServerBuilder() {} + + /** + * This method serves to force sub classes to "hide" this static factory. + */ + public static ServerBuilder forPort(int port) { + throw new UnsupportedOperationException("Subclass failed to hide static factory"); + } + + /** + * Returns the delegated {@code ServerBuilder}. + */ + protected abstract ServerBuilder delegate(); + + @Override + public T directExecutor() { + delegate().directExecutor(); + return thisT(); + } + + @Override + public T executor(@Nullable Executor executor) { + delegate().executor(executor); + return thisT(); + } + + @Override + public T addService(ServerServiceDefinition service) { + delegate().addService(service); + return thisT(); + } + + @Override + public T addService(BindableService bindableService) { + delegate().addService(bindableService); + return thisT(); + } + + @Override + public T intercept(ServerInterceptor interceptor) { + delegate().intercept(interceptor); + return thisT(); + } + + @Override + public T addTransportFilter(ServerTransportFilter filter) { + delegate().addTransportFilter(filter); + return thisT(); + } + + @Override + public T addStreamTracerFactory(ServerStreamTracer.Factory factory) { + delegate().addStreamTracerFactory(factory); + return thisT(); + } + + @Override + public T fallbackHandlerRegistry(@Nullable HandlerRegistry fallbackRegistry) { + delegate().fallbackHandlerRegistry(fallbackRegistry); + return thisT(); + } + + @Override + public T useTransportSecurity(File certChain, File privateKey) { + delegate().useTransportSecurity(certChain, privateKey); + return thisT(); + } + + @Override + public T useTransportSecurity(InputStream certChain, InputStream privateKey) { + delegate().useTransportSecurity(certChain, privateKey); + return thisT(); + } + + @Override + public T decompressorRegistry(@Nullable DecompressorRegistry registry) { + delegate().decompressorRegistry(registry); + return thisT(); + } + + @Override + public T compressorRegistry(@Nullable CompressorRegistry registry) { + delegate().compressorRegistry(registry); + return thisT(); + } + + @Override + public T handshakeTimeout(long timeout, TimeUnit unit) { + delegate().handshakeTimeout(timeout, unit); + return thisT(); + } + + @Override + public T maxInboundMessageSize(int bytes) { + delegate().maxInboundMessageSize(bytes); + return thisT(); + } + + @Override + public T maxInboundMetadataSize(int bytes) { + delegate().maxInboundMetadataSize(bytes); + return thisT(); + } + + @Override + public T setBinaryLog(BinaryLog binaryLog) { + delegate().setBinaryLog(binaryLog); + return thisT(); + } + + /** + * Returns the {@link Server} built by the delegate by default. Overriding method can return + * different value. + */ + @Override + public Server build() { + return delegate().build(); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this).add("delegate", delegate()).toString(); + } + + /** + * Returns the correctly typed version of the builder. + */ + protected final T thisT() { + @SuppressWarnings("unchecked") + T thisT = (T) this; + return thisT; + } +} diff --git a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java index 5362819bc342..919ddf762712 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerBuilder.java @@ -18,17 +18,10 @@ import com.google.common.annotations.VisibleForTesting; import io.grpc.Attributes; -import io.grpc.BindableService; -import io.grpc.CompressorRegistry; -import io.grpc.DecompressorRegistry; import io.grpc.ExperimentalApi; -import io.grpc.HandlerRegistry; +import io.grpc.Internal; import io.grpc.Server; import io.grpc.ServerBuilder; -import io.grpc.ServerInterceptor; -import io.grpc.ServerServiceDefinition; -import io.grpc.ServerStreamTracer; -import io.grpc.ServerTransportFilter; import io.grpc.Status; import io.grpc.netty.InternalNettyServerBuilder; import io.grpc.netty.InternalProtocolNegotiator.ProtocolNegotiator; @@ -42,16 +35,13 @@ import java.io.File; import java.io.InputStream; import java.net.InetSocketAddress; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import javax.annotation.Nullable; import javax.net.ssl.SSLException; /** * A version of {@link ServerBuilder} to create xDS managed servers that will use SDS to set up SSL * with peers. Note, this is not ready to use yet. */ -public final class XdsServerBuilder extends ServerBuilder { +public final class XdsServerBuilder extends ForwardingServerBuilder { private final NettyServerBuilder delegate; private final int port; @@ -64,63 +54,9 @@ private XdsServerBuilder(NettyServerBuilder nettyDelegate, int port) { } @Override - public XdsServerBuilder handshakeTimeout(long timeout, TimeUnit unit) { - delegate.handshakeTimeout(timeout, unit); - return this; - } - - @Override - public XdsServerBuilder directExecutor() { - delegate.directExecutor(); - return this; - } - - @Override - public XdsServerBuilder addStreamTracerFactory(ServerStreamTracer.Factory factory) { - delegate.addStreamTracerFactory(factory); - return this; - } - - @Override - public XdsServerBuilder addTransportFilter(ServerTransportFilter filter) { - delegate.addTransportFilter(filter); - return this; - } - - @Override - public XdsServerBuilder executor(Executor executor) { - delegate.executor(executor); - return this; - } - - @Override - public XdsServerBuilder addService(ServerServiceDefinition service) { - delegate.addService(service); - return this; - } - - @Override - public XdsServerBuilder addService(BindableService bindableService) { - delegate.addService(bindableService); - return this; - } - - @Override - public XdsServerBuilder fallbackHandlerRegistry(@Nullable HandlerRegistry fallbackRegistry) { - delegate.fallbackHandlerRegistry(fallbackRegistry); - return this; - } - - @Override - public XdsServerBuilder useTransportSecurity(File certChain, File privateKey) { - delegate.useTransportSecurity(certChain, privateKey); - return this; - } - - @Override - public XdsServerBuilder useTransportSecurity(InputStream certChain, InputStream privateKey) { - delegate.useTransportSecurity(certChain, privateKey); - return this; + @Internal + protected ServerBuilder delegate() { + return delegate; } /** @@ -163,24 +99,6 @@ public XdsServerBuilder useXdsSecurityWithTransportSecurityFallback( return this; } - @Override - public XdsServerBuilder decompressorRegistry(@Nullable DecompressorRegistry registry) { - delegate.decompressorRegistry(registry); - return this; - } - - @Override - public XdsServerBuilder compressorRegistry(@Nullable CompressorRegistry registry) { - delegate.compressorRegistry(registry); - return this; - } - - @Override - public XdsServerBuilder intercept(ServerInterceptor interceptor) { - delegate.intercept(interceptor); - return this; - } - /** Set the fallback protocolNegotiator. Pass null to unset a previously set value. */ public XdsServerBuilder fallbackProtocolNegotiator( ProtocolNegotiator fallbackProtocolNegotiator) {