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

com.palantir.conjure.java.api.config.service.ServiceConfigurationFactory Maven / Gradle / Ivy

/*
 * (c) Copyright 2017 Palantir Technologies Inc. All rights reserved.
 *
 * 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 com.palantir.conjure.java.api.config.service;

import com.palantir.logsafe.Preconditions;
import com.palantir.logsafe.SafeArg;
import com.palantir.logsafe.exceptions.SafeIllegalArgumentException;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/** Given a {@link ServicesConfigBlock}, populates {@link ServiceConfiguration} instances for configured services. */
public final class ServiceConfigurationFactory {

    private final ServicesConfigBlock services;

    private ServiceConfigurationFactory(ServicesConfigBlock services) {
        this.services = services;
    }

    /** Constructs a factory for a fixed ServicesConfigBlock. */
    public static ServiceConfigurationFactory of(ServicesConfigBlock services) {
        return new ServiceConfigurationFactory(services);
    }

    /** Returns the {@link ServiceConfiguration} for the given name. */
    public ServiceConfiguration get(String serviceName) {
        PartialServiceConfiguration partial = services.services().get(serviceName);
        Preconditions.checkNotNull(
                partial, "No configuration found for service", SafeArg.of("serviceName", serviceName));
        return propagateDefaults(serviceName, partial);
    }

    /** Returns all {@link ServiceConfiguration}s. */
    public Map getAll() {
        // Return a copy of the immutable data.
        Map config = new HashMap<>();
        services.services().forEach((key, value) -> config.put(key, propagateDefaults(key, value)));
        return config;
    }

    /**
     * Checks if a service is enabled, i.e., if the configured {@link #services} contains a service configuration of the
     * given name, and the configuration has at least one {@link PartialServiceConfiguration#uris() URI}.
     */
    public boolean isEnabled(String serviceName) {
        PartialServiceConfiguration serviceConfig = services.services().get(serviceName);
        return serviceConfig != null && !serviceConfig.uris().isEmpty();
    }

    /**
     * Returns a new {@link ServiceConfiguration} obtained by copying all values from the given
     * {@link PartialServiceConfiguration} and then filling in absent optional values with defaults from this
     * {@link ServicesConfigBlock}.
     */
    private ServiceConfiguration propagateDefaults(String serviceName, PartialServiceConfiguration partial) {
        return ServiceConfiguration.builder()
                .apiToken(orElse(partial.apiToken(), services.defaultApiToken()))
                .security(orElse(partial.security(), services.defaultSecurity())
                        .orElseThrow(() -> new SafeIllegalArgumentException(
                                "Must provide default security or service-specific security block for service",
                                SafeArg.of("serviceName", serviceName))))
                .uris(partial.uris())
                .connectTimeout(orElse(partial.connectTimeout(), services.defaultConnectTimeout())
                        .map(t -> Duration.ofMillis(t.toMilliseconds())))
                .readTimeout(orElse(partial.readTimeout(), services.defaultReadTimeout())
                        .map(t -> Duration.ofMillis(t.toMilliseconds())))
                .writeTimeout(orElse(partial.writeTimeout(), services.defaultWriteTimeout())
                        .map(t -> Duration.ofMillis(t.toMilliseconds())))
                .maxNumRetries(partial.maxNumRetries())
                .backoffSlotSize(orElse(partial.backoffSlotSize(), services.defaultBackoffSlotSize())
                        .map(t -> Duration.ofMillis(t.toMilliseconds())))
                .proxy(orElse(partial.proxyConfiguration(), services.defaultProxyConfiguration()))
                .enableGcmCipherSuites(orElse(partial.enableGcmCipherSuites(), services.defaultEnableGcmCipherSuites()))
                .enableHttp2(orElse(partial.enableHttp2(), services.defaultEnableHttp2()))
                .fallbackToCommonNameVerification(orElse(
                        partial.fallbackToCommonNameVerification(), services.defaultFallbackToCommonNameVerification()))
                .build();
    }

    // Returns the first Optional if present, or the second Optional otherwise.
    private static  Optional orElse(Optional first, Optional second) {
        if (first.isPresent()) {
            return first;
        } else {
            return second;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy