Skip to content

Commit

Permalink
xds: Copy ForwardingServerBuilder to xds for XdsServerBuilder
Browse files Browse the repository at this point in the history
This reduces ABI issues caused by returning the more precise
XdsServerBuilder in the API. See
#7552. ForwardingServerBuilder
isn't yet public, so just copy it; it'll be easy to clean up.

Since ForwardingServerBuilder is package-private, the JavaDoc isn't
particularly pretty. But I think that's the best we can do at the
moment.
  • Loading branch information
ejona86 committed Nov 18, 2020
1 parent b3429ec commit 442f0c9
Show file tree
Hide file tree
Showing 2 changed files with 182 additions and 87 deletions.
177 changes: 177 additions & 0 deletions 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 <T> The type of the subclass extending this abstract class.
*/
abstract class ForwardingServerBuilder<T extends ServerBuilder<T>> extends ServerBuilder<T> {

/** 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;
}
}
92 changes: 5 additions & 87 deletions xds/src/main/java/io/grpc/xds/XdsServerBuilder.java
Expand Up @@ -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;
Expand All @@ -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<XdsServerBuilder> {
public final class XdsServerBuilder extends ForwardingServerBuilder<XdsServerBuilder> {

private final NettyServerBuilder delegate;
private final int port;
Expand All @@ -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;
}

/**
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 442f0c9

Please sign in to comment.