Skip to content

Commit

Permalink
Use RestClientsBuildTimeConfig.get to retrieve the REST Client config…
Browse files Browse the repository at this point in the history
…uration
  • Loading branch information
radcortez committed Nov 5, 2024
1 parent b0fda1a commit c1ae264
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
import org.eclipse.microprofile.config.ConfigProvider;
import org.eclipse.microprofile.config.spi.ConfigSource;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import org.jboss.jandex.ClassInfo;

import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;
import io.smallrye.config.ConfigMapping;
import io.smallrye.config.ConfigValue;
import io.smallrye.config.SmallRyeConfig;
import io.smallrye.config.SmallRyeConfigBuilder;
import io.smallrye.config.SmallRyeConfigBuilderCustomizer;
Expand Down Expand Up @@ -89,25 +89,6 @@ interface RestClientBuildConfig {
boolean removesTrailingSlash();
}

/**
* Get the build config for a concrete REST Client implementation.
*/
default Optional<RestClientBuildConfig> getConfigFor(ClassInfo restClientInterface, Optional<String> configKey) {
RestClientBuildConfig config = null;
if (clients().containsKey(restClientInterface.name().toString())) {
// quarkus style config; fully qualified class name
config = clients().get(restClientInterface.name().toString());
} else if (configKey.isPresent() && clients().containsKey(configKey.get())) {
// quarkus style config; configKey
config = clients().get(configKey.get());
} else {
// quarkus style config; short class name
config = clients().get(restClientInterface.simpleName());
}

return Optional.ofNullable(config);
}

/**
* Provides a new {@link RestClientsBuildTimeConfig} with the discovered registered REST Clients configuration
* only. This should be preferred once REST Clients are discovered and validated to keep only the required
Expand All @@ -120,10 +101,15 @@ default Optional<RestClientBuildConfig> getConfigFor(ClassInfo restClientInterfa
* @return a {@link RestClientsBuildTimeConfig} with the discovered registered REST Clients configuration only.
*/
default RestClientsBuildTimeConfig get(List<RegisteredRestClient> restClients) {
SmallRyeConfig config = new SmallRyeConfigBuilder()
return getConfig(restClients).getConfigMapping(RestClientsBuildTimeConfig.class);
}

default SmallRyeConfig getConfig(List<RegisteredRestClient> restClients) {
return new SmallRyeConfigBuilder()
.withSources(
new ConfigSource() {
final SmallRyeConfig config = ConfigProvider.getConfig().unwrap(SmallRyeConfig.class);
final ConfigSource defaultsSource = getDefaultsSource();

@Override
public Set<String> getPropertyNames() {
Expand All @@ -134,13 +120,25 @@ public Set<String> getPropertyNames() {

@Override
public String getValue(final String propertyName) {
return config.getRawValue(propertyName);
ConfigValue configValue = config.getConfigValue(propertyName);
if (configValue != null && !defaultsSource.getName().equals(configValue.getSourceName())) {
return configValue.getValue();
}
return null;
}

@Override
public String getName() {
return "SmallRye Config";
}

private ConfigSource getDefaultsSource() {
ConfigSource configSource = null;
for (ConfigSource source : config.getConfigSources()) {
configSource = source;
}
return configSource;
}
})
.withCustomizers(new SmallRyeConfigBuilderCustomizer() {
@Override
Expand All @@ -156,7 +154,5 @@ public List<RegisteredRestClient> getRestClients() {
.withMapping(RestClientsBuildTimeConfig.class)
.withMappingIgnore("quarkus.**")
.build();

return config.getConfigMapping(RestClientsBuildTimeConfig.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

Expand Down Expand Up @@ -224,6 +225,19 @@ public List<RegisteredRestClient> getRestClients() {
assertNotNull(config);
}

@Test
void buildTimeConfig() {
SmallRyeConfig config = ConfigUtils.emptyConfigBuilder()
.withMapping(RestClientsBuildTimeConfig.class)
.build();
assertNotNull(config);

RestClientsBuildTimeConfig buildTimeConfig = config.getConfigMapping(RestClientsBuildTimeConfig.class)
.get(List.of(new RegisteredRestClient(ConfigKeyRestClient.class, "key")));

assertFalse(buildTimeConfig.clients().get(ConfigKeyRestClient.class.getName()).removesTrailingSlash());
}

private void verifyConfig(RestClientConfig config) {
assertTrue(config.url().isPresent());
assertThat(config.url().get()).isEqualTo("http://localhost:8080");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ quarkus.rest-client."io.quarkus.restclient.config.FullNameRestClient".connection
quarkus.rest-client."io.quarkus.restclient.config.FullNameRestClient".connection-pool-size=10
quarkus.rest-client."io.quarkus.restclient.config.FullNameRestClient".max-chunk-size=1024

quarkus.rest-client.key.removes-trailing-slash=false
quarkus.rest-client.key.url=http://localhost:8080
quarkus.rest-client.key.uri=http://localhost:8081
quarkus.rest-client.key.scope=Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@
import io.quarkus.rest.client.reactive.runtime.RestClientReactiveConfig;
import io.quarkus.rest.client.reactive.runtime.RestClientRecorder;
import io.quarkus.rest.client.reactive.spi.RestClientAnnotationsTransformerBuildItem;
import io.quarkus.restclient.config.RegisteredRestClient;
import io.quarkus.restclient.config.RestClientsBuildTimeConfig;
import io.quarkus.restclient.config.RestClientsConfig;
import io.quarkus.restclient.config.deployment.RestClientConfigUtils;
Expand Down Expand Up @@ -173,9 +174,15 @@ void setUpClientBuildTimeProperties(BuildProducer<RestClientDefaultConsumesBuild
disableSmartProduces.produce(new RestClientDisableSmartDefaultProduces());
}

List<RegisteredRestClient> registeredRestClients = toRegisteredRestClients(registeredRestClientBuildItems);
RestClientsBuildTimeConfig buildTimeConfig = configsPerClient.get(registeredRestClients);

List<DotName> clientsToDisable = new ArrayList<>();
for (RegisteredRestClientBuildItem registeredRestClient : registeredRestClientBuildItems) {
if (removesTrailingSlashIsDisabled(configsPerClient, registeredRestClient)) {
if (!buildTimeConfig.removesTrailingSlash() ||
!buildTimeConfig.clients()
.get(registeredRestClient.getClassInfo().name().toString())
.removesTrailingSlash()) {
clientsToDisable.add(registeredRestClient.getClassInfo().name());
}
}
Expand Down Expand Up @@ -855,19 +862,6 @@ private boolean isRestMethod(MethodInfo method) {
return false;
}

private boolean removesTrailingSlashIsDisabled(RestClientsBuildTimeConfig config,
RegisteredRestClientBuildItem registeredRestClient) {
// is disabled for all the clients
if (!config.removesTrailingSlash()) {
return true;
}

// is disabled for this concrete client
Optional<RestClientsBuildTimeConfig.RestClientBuildConfig> configForClient = config
.getConfigFor(registeredRestClient.getClassInfo(), registeredRestClient.getConfigKey());
return configForClient.isPresent() && !configForClient.get().removesTrailingSlash();
}

private ScopeInfo computeDefaultScope(Capabilities capabilities, Config config,
ClassInfo restClientInterface,
Optional<String> configKey) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import java.util.stream.Collectors;

import org.apache.commons.lang3.exception.UncheckedException;
import org.eclipse.microprofile.config.ConfigProvider;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.IndexView;
import org.jboss.logging.Logger;
Expand All @@ -32,6 +31,7 @@
import io.quarkus.rest.client.reactive.deployment.RegisteredRestClientBuildItem;
import io.quarkus.rest.client.reactive.spi.DevServicesRestClientProxyProvider;
import io.quarkus.rest.client.reactive.spi.RestClientHttpProxyBuildItem;
import io.quarkus.restclient.config.RegisteredRestClient;
import io.quarkus.restclient.config.RestClientsBuildTimeConfig;
import io.quarkus.restclient.config.RestClientsBuildTimeConfig.RestClientBuildConfig;
import io.smallrye.config.SmallRyeConfig;
Expand Down Expand Up @@ -60,14 +60,15 @@ public void determineRequiredProxies(
CombinedIndexBuildItem combinedIndexBuildItem,
List<RegisteredRestClientBuildItem> registeredRestClientBuildItems,
BuildProducer<RestClientHttpProxyBuildItem> producer) {
Map<String, RestClientBuildConfig> configs = clientsConfig.get(toRegisteredRestClients(registeredRestClientBuildItems))
.clients();

List<RegisteredRestClient> registeredRestClients = toRegisteredRestClients(registeredRestClientBuildItems);
Map<String, RestClientBuildConfig> configs = clientsConfig.get(registeredRestClients).clients();
if (configs.isEmpty()) {
return;
}

IndexView index = combinedIndexBuildItem.getIndex();
SmallRyeConfig config = ConfigProvider.getConfig().unwrap(SmallRyeConfig.class);
SmallRyeConfig config = clientsConfig.getConfig(registeredRestClients);
for (var configEntry : configs.entrySet()) {
if (!configEntry.getValue().enableLocalProxy()) {
log.trace("Ignoring config key: '" + configEntry.getKey() + "' because enableLocalProxy is false");
Expand Down

0 comments on commit c1ae264

Please sign in to comment.