This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch profile in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git
commit ad466ad998179d8c9557c0a1760b8c20b9d3901f Author: Claus Ibsen <[email protected]> AuthorDate: Tue Jun 30 07:53:56 2026 +0200 CAMEL-23858: camel-spring-boot - Configuring camel.main.profile should be supported --- .../src/main/docs/spring-boot.json | 6 +++++ .../camel/spring/boot/CamelAutoConfiguration.java | 27 ++++++++++++++++++++++ .../CamelErrorRegistryAutoConfiguration.java | 4 ++++ .../CamelSecurityPolicyAutoConfiguration.java | 8 +++++++ .../boot/trace/CamelTraceAutoConfiguration.java | 4 ++++ tooling/camel-spring-boot-dependencies/pom.xml | 2 +- 6 files changed, 50 insertions(+), 1 deletion(-) diff --git a/core/camel-spring-boot/src/main/docs/spring-boot.json b/core/camel-spring-boot/src/main/docs/spring-boot.json index cf2734271fe..80b6541d6ca 100644 --- a/core/camel-spring-boot/src/main/docs/spring-boot.json +++ b/core/camel-spring-boot/src/main/docs/spring-boot.json @@ -852,6 +852,12 @@ "sourceType": "org.apache.camel.spring.boot.CamelConfigurationProperties$Main", "defaultValue": 1000 }, + { + "name": "camel.main.profile", + "type": "java.lang.String", + "description": "Camel profile to use when running. The dev profile is for development, which enables a set of additional developer focus functionality, tracing, debugging, and gathering additional runtime statistics that are useful during development. However, those additional features has a slight overhead cost, and are not enabled for production profile. The default profile is prod.", + "sourceType": "org.apache.camel.spring.boot.CamelConfigurationProperties$Main" + }, { "name": "camel.main.route-filter-exclude-pattern", "type": "java.lang.String", diff --git a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java index 434c2662288..047af95ba91 100644 --- a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java +++ b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java @@ -37,6 +37,7 @@ import org.apache.camel.component.properties.PropertiesParser; import org.apache.camel.main.DebuggerConfigurationProperties; import org.apache.camel.main.DefaultConfigurationConfigurer; import org.apache.camel.main.MainListener; +import org.apache.camel.main.ProfileConfigurer; import org.apache.camel.main.RoutesCollector; import org.apache.camel.main.fatjar.FatJarPackageScanClassResolver; import org.apache.camel.main.fatjar.FatJarPackageScanResourceResolver; @@ -216,6 +217,11 @@ public class CamelAutoConfiguration { config.getMain().getRouteFilterIncludePattern(), config.getMain().getRouteFilterExcludePattern()); } + // configure profile (dev/prod) defaults before applying main configuration, + // so that profile defaults are set but user-explicit properties take precedence + Properties autoConfigured = doExtractCamelMainProperties(applicationContext); + ProfileConfigurer.configureCommon(camelContext, config.getMain().getProfile(), config.getMain(), autoConfigured); + // configure the common/default options DefaultConfigurationConfigurer.configure(camelContext, config.getMain()); // lookup and configure SPI beans @@ -230,6 +236,27 @@ public class CamelAutoConfiguration { return camelContext; } + /** + * Collect all camel.main.* property names that the user has explicitly configured + * so that ProfileConfigurer does not override them with profile defaults. + */ + protected static Properties doExtractCamelMainProperties(ApplicationContext applicationContext) { + Properties answer = new Properties(); + Environment env = applicationContext.getEnvironment(); + if (env instanceof ConfigurableEnvironment cev) { + cev.getPropertySources().forEach(ps -> { + if (ps instanceof EnumerablePropertySource<?> eps) { + for (String n : eps.getPropertyNames()) { + if (n.startsWith("camel.main.")) { + answer.put(n, cev.getProperty(n, "")); + } + } + } + }); + } + return answer; + } + protected static Map<String, String> doExtractVariablesFromSpringBoot(ConfigurableEnvironment env) { Map<String, String> answer = new LinkedHashMap<>(); diff --git a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/errorregistry/CamelErrorRegistryAutoConfiguration.java b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/errorregistry/CamelErrorRegistryAutoConfiguration.java index d5dc728314c..401ca4d9690 100644 --- a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/errorregistry/CamelErrorRegistryAutoConfiguration.java +++ b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/errorregistry/CamelErrorRegistryAutoConfiguration.java @@ -33,6 +33,10 @@ public class CamelErrorRegistryAutoConfiguration { @Bean public ErrorRegistry errorRegistry(CamelContext camelContext, CamelErrorRegistryConfigurationProperties config) { + // dev profile enables error registry to capture routing errors for tooling (TUI) + if (!config.isEnabled() && "dev".equals(camelContext.getCamelContextExtension().getProfile())) { + config.setEnabled(true); + } if (!config.isEnabled()) { return null; } diff --git a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSecurityPolicyAutoConfiguration.java b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSecurityPolicyAutoConfiguration.java index 984c010961a..909287d45c7 100644 --- a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSecurityPolicyAutoConfiguration.java +++ b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSecurityPolicyAutoConfiguration.java @@ -50,6 +50,14 @@ public class CamelSecurityPolicyAutoConfiguration { SecurityPolicyResult camelSecurityPolicyResult(CamelContext camelContext, CamelSecurityPolicyConfigurationProperties config, Environment environment) { + // apply profile-based security defaults + String profile = camelContext.getCamelContextExtension().getProfile(); + if ("dev".equals(profile) && config.getInsecureDevPolicy() == null) { + config.setInsecureDevPolicy("allow"); + } else if ("prod".equals(profile) && "warn".equals(config.getPolicy())) { + config.setPolicy("fail"); + } + SecurityConfigurationProperties securityConfig = applySecurityProperties(camelContext, config); Map<String, Object> camelProperties = extractCamelProperties(environment); diff --git a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/trace/CamelTraceAutoConfiguration.java b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/trace/CamelTraceAutoConfiguration.java index c3d3f3b0b34..9c03a19d5ba 100644 --- a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/trace/CamelTraceAutoConfiguration.java +++ b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/trace/CamelTraceAutoConfiguration.java @@ -32,6 +32,10 @@ public class CamelTraceAutoConfiguration { @Bean public BacklogTracer backlogTracer(CamelContext camelContext, CamelTraceConfigurationProperties config) throws Exception { + // dev profile enables tracer standby so tooling (TUI) can activate tracing on demand + if (!config.isStandby() && "dev".equals(camelContext.getCamelContextExtension().getProfile())) { + config.setStandby(true); + } if (!config.isEnabled() && !config.isStandby()) { return null; } diff --git a/tooling/camel-spring-boot-dependencies/pom.xml b/tooling/camel-spring-boot-dependencies/pom.xml index 87a4fddc99c..c768db4ef8d 100644 --- a/tooling/camel-spring-boot-dependencies/pom.xml +++ b/tooling/camel-spring-boot-dependencies/pom.xml @@ -5223,7 +5223,7 @@ <dependency> <groupId>org.junit</groupId> <artifactId>junit-start</artifactId> - <version>6.1.0</version> + <version>6.1.1</version> </dependency> <dependency> <groupId>org.xmlunit</groupId>
