All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.oracle.coherence.client.config.DefaultGrpcChannelDependencies Maven / Gradle / Ivy

/*
 * Copyright (c) 2000, 2022, Oracle and/or its affiliates.
 *
 * Licensed under the Universal Permissive License v 1.0 as shown at
 * https://oss.oracle.com/licenses/upl.
 */
package com.oracle.coherence.client.config;

import com.oracle.coherence.client.ChannelProvider;
import com.oracle.coherence.client.GrpcChannelConfigurer;
import com.tangosol.coherence.config.SimpleParameterList;
import com.tangosol.coherence.config.builder.AddressProviderBuilder;
import com.tangosol.coherence.config.builder.ParameterizedBuilder;
import com.tangosol.coherence.config.builder.SocketProviderBuilder;
import com.tangosol.coherence.config.builder.WrapperSocketAddressProviderBuilder;
import com.tangosol.coherence.config.unit.Seconds;
import com.tangosol.config.annotation.Injectable;
import com.tangosol.config.expression.Expression;
import com.tangosol.config.expression.ParameterResolver;
import com.tangosol.config.expression.SystemPropertyParameterResolver;
import com.tangosol.net.AddressProvider;
import com.tangosol.net.SocketAddressProvider;
import com.tangosol.net.grpc.GrpcChannelDependencies;

import java.util.Optional;

/**
 * A default implementation of {@link GrpcChannelDependencies}.
 *
 * @author Jonathan Knight  2022.08.25
 * @since 22.06.2
 */
public class DefaultGrpcChannelDependencies
        implements GrpcChannelDependencies
    {
    /**
     * Returns the optional {@link ChannelProvider} to use to
     * create a {@link io.grpc.Channel}.
     *
     * @return the optional {@link ChannelProvider} to use to
     *         create a {@link io.grpc.Channel}
     */
    @Override
    @SuppressWarnings("unchecked")
    public Optional getChannelProvider()
        {
        if (m_bldrChannelProvider != null)
            {
            SystemPropertyParameterResolver resolver   = new SystemPropertyParameterResolver();
            ChannelProvider                 provider   = m_bldrChannelProvider.realize(resolver, null, null);
            return Optional.ofNullable(provider);
            }
        return Optional.empty();
        }

    /**
     * Set the {@link ParameterizedBuilder} that builds a {@link ChannelProvider}.
     *
     * @param bldr  the {@link ParameterizedBuilder} that builds a {@link ChannelProvider}
     */
    @Injectable("instance")
    public void setChannelProvider(ParameterizedBuilder bldr)
        {
        m_bldrChannelProvider = bldr;
        }

    /**
     * Set the value to be used when creating a {@link io.grpc.ManagedChannelBuilder#forTarget(String)
     * ManagedChannelBuilder for a target URI}.
     *
     * @param sTarget  the value to be used when calling {@link io.grpc.ManagedChannelBuilder#forTarget(String)}
     */
    @Injectable
    public void setTarget(String sTarget)
        {
        m_sTarget = sTarget;
        }

    @Override
    public String getTarget()
        {
        return m_sTarget;
        }

    /**
     * Returns whether the configured {@link AddressProvider} is for a NameService lookup.
     *
     * @return  {@code true} if the configured {@link AddressProvider} is for a
     *          NameService lookup, or {@code false} if the addresses are for a
     *          gRPC proxy.
     */
    public boolean isNameServiceAddressProvider()
        {
        return m_fNameServiceAddressProvider || m_bldrAddressProviderRemote == null;
        }

    /**
     * Sets the remote AddressProvider is for connections to a NameService.
     * (set to null to disable)
     * 

* After calling this method, {@link #isNameServiceAddressProvider()} will * return true (assuming a non-null value was provided). * * @param bldr the {@link AddressProvider} builder for the NameService */ @Injectable("name-service-addresses") public void setNameServiceAddressProviderBuilder(AddressProviderBuilder bldr) { setRemoteAddressProviderBuilder(bldr); m_fNameServiceAddressProvider = bldr != null; } /** * Set the remote AddressProvider builder. *

* After calling this method, {@link #isNameServiceAddressProvider()} will return false. * * @param bldr the remote AddressProvider builder */ @Injectable("remote-addresses") public void setRemoteAddressProviderBuilder(AddressProviderBuilder bldr) { if (bldr == null) { m_bldrAddressProviderRemote = null; } else { m_bldrAddressProviderRemote = new WrapperSocketAddressProviderBuilder(bldr); } m_fNameServiceAddressProvider = false; } @Override public ParameterizedBuilder getRemoteAddressProviderBuilder() { return m_bldrAddressProviderRemote; } /** * Set the {@link SocketProviderBuilder} to use to configure an SSL context * for the gRPC channel. If the socket provider is not an SSL provider it * will be ignored. * * @param builder the {@link SocketProviderBuilder} to use to configure an SSL context * for the gRPC channel */ @Injectable public void setSocketProvider(SocketProviderBuilder builder) { m_builderSocketProvider = builder; } @Override public SocketProviderBuilder getSocketProviderBuilder() { return m_builderSocketProvider; } /** * Set the value to use in {@link io.grpc.ManagedChannelBuilder#overrideAuthority(String)}. * * @param sAuthority the value to use in {@link io.grpc.ManagedChannelBuilder#overrideAuthority(String)} */ @Injectable("override-authority") public void setOverrideAuthority(String sAuthority) { m_sOverrideAuthority = sAuthority; } @Override public Optional getAuthorityOverride() { return Optional.ofNullable(m_sOverrideAuthority); } /** * Set the value to use in {@link io.grpc.ManagedChannelBuilder#defaultLoadBalancingPolicy(String)}. *

* This value must be a valid load balancer registered with the gRPC framework. * * @param sPolicy the value to use in {@link io.grpc.ManagedChannelBuilder#defaultLoadBalancingPolicy(String)} */ @Injectable("load-balancer-policy") public void setLoadBalancerPolicy(String sPolicy) { m_sLoadBalancerPolicy = sPolicy; } @Override public String getDefaultLoadBalancingPolicy() { String sPolicy = m_sLoadBalancerPolicy; if (sPolicy == null || sPolicy.isBlank()) { sPolicy = m_sLoadBalancerPolicy = GrpcChannelDependencies.DEFAULT_LOAD_BALANCER_POLICY; } return sPolicy; } @Injectable("load-balancer-timeout") public void setLoadBalancerTimeout(Expression expr) { m_expLoadBalancerTimeout = expr == null ? GrpcChannelDependencies.DEFAULT_LOAD_BALANCER_TIMEOUT : expr; } @Override public long getLoadBalancerTimeout(ParameterResolver resolver) { Seconds seconds = m_expLoadBalancerTimeout.evaluate(resolver); if (seconds == null) { seconds = GrpcChannelDependencies.DEFAULT_LOAD_BALANCER_TIMEOUT.evaluate(resolver); } return seconds.get(); } /** * Set the optional {@link ParameterizedBuilder} that will build a {@link GrpcChannelConfigurer} * that can apply further configuration to a {@link io.grpc.ManagedChannelBuilder}. * * @param bldr the optional {@link ParameterizedBuilder} that will build a {@link GrpcChannelConfigurer} * that can apply further configuration to a {@link io.grpc.ManagedChannelBuilder} */ @Injectable("configurer") public void setConfigurer(ParameterizedBuilder bldr) { m_configurerBuilder = bldr; } @Override public Optional getConfigurer() { if (m_configurerBuilder != null) { SystemPropertyParameterResolver resolver = new SystemPropertyParameterResolver(); SimpleParameterList parameters = new SimpleParameterList(); GrpcChannelConfigurer configurer = m_configurerBuilder.realize(resolver, null, parameters); return Optional.ofNullable(configurer); } return Optional.empty(); } // ----- data members --------------------------------------------------- /** * The optional target to use to construct a {@link io.grpc.ManagedChannelBuilder} * using a call to {@link io.grpc.ManagedChannelBuilder#forTarget(String)}. */ private String m_sTarget; /** * An optional {@link SocketProviderBuilder} to create an SSL context for the channel. */ private SocketProviderBuilder m_builderSocketProvider; /** * The remote SocketAddressProvider builder to build the list of server addresses. */ private ParameterizedBuilder m_bldrAddressProviderRemote; /** * Whether the remote AddressProvider is for connections to a NameService. */ private boolean m_fNameServiceAddressProvider = false; /** * The value to pass to the {@link io.grpc.ManagedChannelBuilder#overrideAuthority(String)} method. */ private String m_sOverrideAuthority; /** * The value to pass to the {@link io.grpc.ManagedChannelBuilder#defaultLoadBalancingPolicy(String)}} method. */ private String m_sLoadBalancerPolicy; /** * The timeout to apply to load balancer address resolution. */ private Expression m_expLoadBalancerTimeout = GrpcChannelDependencies.DEFAULT_LOAD_BALANCER_TIMEOUT; /** * A {@link ParameterizedBuilder} that can build a {@link GrpcChannelConfigurer}. */ private ParameterizedBuilder m_configurerBuilder; /** * A {@link ParameterizedBuilder} that can build a {@link ChannelProvider}. */ private ParameterizedBuilder m_bldrChannelProvider; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy