package com.linkedin.restli.client;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linkedin.restli.client.Request;
import com.linkedin.restli.client.config.RequestConfig;
import com.linkedin.restli.client.config.RequestConfigProvider;
class MultipleRequestConfigProvider implements RequestConfigProvider {
private static final Logger LOGGER = LoggerFactory.getLogger(MultipleRequestConfigProvider.class);
private final Map<String, ParSeqRestliClientConfig> _configs;
private final ParSeqRestliClientConfigChooser _chooser;
private final InboundRequestContextFinder _inboundRequestContextFinder;
private final ConcurrentHashMap<String, RequestConfigProvider> _providers = new ConcurrentHashMap<>();
public MultipleRequestConfigProvider(Map<String, ParSeqRestliClientConfig> configs,
ParSeqRestliClientConfigChooser chooser, InboundRequestContextFinder inboundRequestContextFinder) {
_configs = configs;
_chooser = chooser;
_inboundRequestContextFinder = inboundRequestContextFinder;
//initialize RequestConfigProviders at construction time to
//avoid failures at runtime
_configs.keySet().forEach(type -> {
LOGGER.info("Initializing ParSeqRestClientConfig: {}", type);
_providers.put(type, getProvider(type));
});
}
private RequestConfigProvider getProvider(String type) {
return RequestConfigProvider.build(_configs.get(type), _inboundRequestContextFinder);
}
@Override
public RequestConfig apply(Request<?> request) {
String type = _chooser.apply(_inboundRequestContextFinder.find(), request);
RequestConfigProvider provider = _providers.computeIfAbsent(type, this::getProvider);
return provider.apply(request);
}
}