This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 503296b90b9 CAMEL-20358: Make CamelMicroProfilePropertiesSource aware of profiles when loading properties 503296b90b9 is described below commit 503296b90b9a93dd03630569b2c4d677b3e0ba13 Author: James Netherton <jamesnether...@gmail.com> AuthorDate: Tue Jan 23 08:01:49 2024 +0000 CAMEL-20358: Make CamelMicroProfilePropertiesSource aware of profiles when loading properties --- .../camel-microprofile-config/pom.xml | 12 +++---- .../config/CamelMicroProfilePropertiesSource.java | 35 +++++++++++++++++-- .../CamelMicroProfilePropertiesSourceTest.java | 39 ++++++++++++++++++++-- 3 files changed, 74 insertions(+), 12 deletions(-) diff --git a/components/camel-microprofile/camel-microprofile-config/pom.xml b/components/camel-microprofile/camel-microprofile-config/pom.xml index 49807583948..5fbc2dbb294 100644 --- a/components/camel-microprofile/camel-microprofile-config/pom.xml +++ b/components/camel-microprofile/camel-microprofile-config/pom.xml @@ -45,6 +45,11 @@ <version>${project.version}</version> </dependency> + <dependency> + <groupId>io.smallrye.config</groupId> + <artifactId>smallrye-config</artifactId> + <version>${smallrye-config-version}</version> + </dependency> <dependency> <groupId>org.eclipse.microprofile.config</groupId> <artifactId>microprofile-config-api</artifactId> @@ -58,13 +63,6 @@ <scope>test</scope> </dependency> - <dependency> - <groupId>io.smallrye.config</groupId> - <artifactId>smallrye-config</artifactId> - <version>${smallrye-config-version}</version> - <scope>test</scope> - </dependency> - <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> diff --git a/components/camel-microprofile/camel-microprofile-config/src/main/java/org/apache/camel/component/microprofile/config/CamelMicroProfilePropertiesSource.java b/components/camel-microprofile/camel-microprofile-config/src/main/java/org/apache/camel/component/microprofile/config/CamelMicroProfilePropertiesSource.java index 6fd85bae4c3..b0f6f391061 100644 --- a/components/camel-microprofile/camel-microprofile-config/src/main/java/org/apache/camel/component/microprofile/config/CamelMicroProfilePropertiesSource.java +++ b/components/camel-microprofile/camel-microprofile-config/src/main/java/org/apache/camel/component/microprofile/config/CamelMicroProfilePropertiesSource.java @@ -16,10 +16,13 @@ */ package org.apache.camel.component.microprofile.config; +import java.util.Collections; +import java.util.List; import java.util.NoSuchElementException; import java.util.Properties; import java.util.function.Predicate; +import io.smallrye.config.SmallRyeConfig; import org.apache.camel.spi.LoadablePropertiesSource; import org.apache.camel.spi.annotations.JdkService; import org.eclipse.microprofile.config.Config; @@ -35,6 +38,20 @@ import org.slf4j.LoggerFactory; public class CamelMicroProfilePropertiesSource implements LoadablePropertiesSource { private static final Logger LOG = LoggerFactory.getLogger(CamelMicroProfilePropertiesSource.class); + private List<String> profiles = Collections.emptyList(); + + public CamelMicroProfilePropertiesSource() { + try { + this.profiles = ConfigProvider.getConfig() + .unwrap(SmallRyeConfig.class) + .getProfiles(); + } catch (IllegalArgumentException e) { + // Handle unlikely event that the config could not be unwrapped + if (LOG.isDebugEnabled()) { + LOG.debug("Failed to discover active configuration profiles", e); + } + } + } @Override public String getName() { @@ -52,7 +69,9 @@ public class CamelMicroProfilePropertiesSource implements LoadablePropertiesSour final Config config = ConfigProvider.getConfig(); for (String name : config.getPropertyNames()) { try { - answer.put(name, config.getValue(name, String.class)); + if (isValidForActiveProfiles(name)) { + answer.put(name, config.getValue(name, String.class)); + } } catch (NoSuchElementException e) { if (LOG.isDebugEnabled()) { LOG.debug("Failed to resolve property {} due to {}", name, e.getMessage()); @@ -69,7 +88,7 @@ public class CamelMicroProfilePropertiesSource implements LoadablePropertiesSour final Config config = ConfigProvider.getConfig(); for (String name : config.getPropertyNames()) { - if (filter.test(name)) { + if (isValidForActiveProfiles(name) && filter.test(name)) { try { config.getOptionalValue(name, String.class).ifPresent(value -> answer.put(name, value)); } catch (NoSuchElementException e) { @@ -92,4 +111,16 @@ public class CamelMicroProfilePropertiesSource implements LoadablePropertiesSour public String toString() { return "camel-microprofile-config"; } + + private boolean isValidForActiveProfiles(String name) { + if (!profiles.isEmpty() && name.startsWith("%")) { + for (String profile : profiles) { + if (name.startsWith(profile + ".", 1)) { + return true; + } + } + return false; + } + return true; + } } diff --git a/components/camel-microprofile/camel-microprofile-config/src/test/java/org/apache/camel/component/microprofile/config/CamelMicroProfilePropertiesSourceTest.java b/components/camel-microprofile/camel-microprofile-config/src/test/java/org/apache/camel/component/microprofile/config/CamelMicroProfilePropertiesSourceTest.java index b25f4fcc584..67290b96ef9 100644 --- a/components/camel-microprofile/camel-microprofile-config/src/test/java/org/apache/camel/component/microprofile/config/CamelMicroProfilePropertiesSourceTest.java +++ b/components/camel-microprofile/camel-microprofile-config/src/test/java/org/apache/camel/component/microprofile/config/CamelMicroProfilePropertiesSourceTest.java @@ -34,6 +34,8 @@ import org.eclipse.microprofile.config.spi.ConfigProviderResolver; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + public class CamelMicroProfilePropertiesSourceTest extends CamelTestSupport { private Config config; @@ -46,10 +48,17 @@ public class CamelMicroProfilePropertiesSourceTest extends CamelTestSupport { prop.put("hi", "World"); prop.put("my-mock", "result"); prop.put("empty", ""); + prop.put("%non-active-profile.test-non-active-profile", "should not see this"); + prop.put("%profileA.test-profile-a", "Profile A"); + prop.put("%profileB.test-profile-b", "Profile B"); // create PMC config source and register it so we can use it for testing PropertiesConfigSource pcs = new PropertiesConfigSource(prop, "my-smallrye-config"); - config = new SmallRyeConfigBuilder().withSources(pcs).build(); + config = new SmallRyeConfigBuilder() + .withProfile("profileA") + .withProfile("profileB") + .withSources(pcs) + .build(); ConfigProviderResolver.instance().registerConfig(config, CamelMicroProfilePropertiesSourceTest.class.getClassLoader()); @@ -90,16 +99,22 @@ public class CamelMicroProfilePropertiesSourceTest extends CamelTestSupport { Assertions.assertThat(properties.get("hi")).isEqualTo("World"); Assertions.assertThat(properties.get("my-mock")).isEqualTo("result"); Assertions.assertThat(properties.get("empty")).isNull(); + Assertions.assertThat(properties.get("test-non-active-profile")).isNull(); + Assertions.assertThat(properties.get("test-profile-a")).isEqualTo("Profile A"); + Assertions.assertThat(properties.get("test-profile-b")).isEqualTo("Profile B"); } @Test public void testLoadFiltered() { PropertiesComponent pc = context.getPropertiesComponent(); - Properties properties = pc.loadProperties(k -> k.length() > 2); + Properties properties = pc.loadProperties(k -> k.matches("^start$|.*mock$|.*-profile.*")); - Assertions.assertThat(properties).hasSize(2); + Assertions.assertThat(properties).hasSize(4); Assertions.assertThat(properties.get("start")).isEqualTo("direct:start"); Assertions.assertThat(properties.get("my-mock")).isEqualTo("result"); + Assertions.assertThat(properties.get("test-non-active-profile")).isNull(); + Assertions.assertThat(properties.get("test-profile-a")).isEqualTo("Profile A"); + Assertions.assertThat(properties.get("test-profile-b")).isEqualTo("Profile B"); } @Test @@ -111,6 +126,24 @@ public class CamelMicroProfilePropertiesSourceTest extends CamelTestSupport { MockEndpoint.assertIsSatisfied(context); } + @Test + public void testActiveConfigProfiles() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Profile A :: Profile B"); + + template.sendBody("direct:start", context.resolvePropertyPlaceholders("{{test-profile-a}} :: {{test-profile-b}}")); + + MockEndpoint.assertIsSatisfied(context); + } + + @Test + public void testInactiveConfigProfiles() throws Exception { + assertThatThrownBy(() -> { + template.sendBody("direct:start", context.resolvePropertyPlaceholders("{{test-non-active-profile}}")); + }) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("Property with key [test-non-active-profile] not found"); + } + @Override protected RoutesBuilder createRouteBuilder() { return new RouteBuilder() {