package com.netflix.suro.client; import java.util.Map; import javax.inject.Inject; import com.google.inject.Provider; import com.netflix.governator.guice.lazy.LazySingleton; import com.netflix.suro.ClientConfig; /** * Configuration base {@link ISuroClient} provider that will create an {@link ISuroClient} * implementation based on the value of {@link ClienConfig.getClientType()}. * * To add a new client type implementation see {@link SuroClientModule} * * @author elandau * */ @LazySingleton public class ConfigBasedSuroClientProvider implements Provider<ISuroClient> { private final Provider<ClientConfig> configProvider; private final Map<String, Provider<ISuroClient>> clientImpls; private static final String DEFAULT_CLIENT_TYPE = "sync"; @Inject public ConfigBasedSuroClientProvider(Provider<ClientConfig> configProvider, Map<String, Provider<ISuroClient>> clientImpls) { this.configProvider = configProvider; this.clientImpls = clientImpls; } @Override public ISuroClient get() { // Load the singleton ClientConfig lazily ClientConfig config = configProvider.get(); if (config.getClientType() != null) { if (!clientImpls.containsKey(config.getClientType())) { throw new RuntimeException( String.format("Unknown client type '%s'. Expecting one of %s", config.getClientType(), clientImpls.keySet())); } return clientImpls.get(config.getClientType()).get(); } else { return clientImpls.get(DEFAULT_CLIENT_TYPE).get(); } } }