This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 9b6cf155990e52e9c605980d3ffb1a6a612abfef
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Wed Dec 1 19:35:14 2021 +0100

    CAMEL-17257: camel-core - RouteBuilder should store source location of the 
file from the DSL loader
---
 .../src/main/java/org/apache/camel/Route.java      |   8 ++
 .../java/org/apache/camel/spi/RouteFactory.java    |   4 +-
 .../camel/impl/engine/AbstractCamelContext.java    |  16 ++-
 .../org/apache/camel/impl/engine/DefaultRoute.java |  12 +-
 .../camel/impl/engine/DefaultRouteFactory.java     |   6 +-
 .../org/apache/camel/builder/RouteBuilder.java     |  18 +++
 .../org/apache/camel/model/RouteDefinition.java    |  11 ++
 .../org/apache/camel/model/RoutesDefinition.java   |  14 +++
 .../org/apache/camel/reifier/RouteReifier.java     |   2 +-
 .../DefaultExceptionPolicyStrategyTest.java        |   2 +-
 .../apache/camel/reifier/ProcessorReifierTest.java |   2 +-
 .../builder/endpoint/EndpointRouteBuilder.java     |   1 +
 .../api/management/mbean/ManagedRouteMBean.java    |   3 +
 .../camel/management/mbean/ManagedRoute.java       |   7 ++
 .../camel/support/RouteWatcherReloadStrategy.java  | 129 ++++++++++++---------
 .../dsl/support/RouteBuilderLoaderSupport.java     |   1 +
 .../org/apache/camel/main/KameletMainTest.java     |   2 +
 17 files changed, 169 insertions(+), 69 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/Route.java 
b/core/camel-api/src/main/java/org/apache/camel/Route.java
index 7f325ad..0d4d3ff 100644
--- a/core/camel-api/src/main/java/org/apache/camel/Route.java
+++ b/core/camel-api/src/main/java/org/apache/camel/Route.java
@@ -23,6 +23,7 @@ import java.util.Set;
 
 import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.ManagementInterceptStrategy;
+import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RouteController;
 import org.apache.camel.spi.RouteError;
 import org.apache.camel.spi.RoutePolicy;
@@ -134,6 +135,13 @@ public interface Route extends RuntimeConfiguration {
     String getConfigurationId();
 
     /**
+     * Gets the source resource that this route is located from
+     *
+     * @return the source, or null if this route is not loaded from a resource
+     */
+    Resource getSourceResource();
+
+    /**
      * Gets the camel context
      *
      * @return the camel context
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/RouteFactory.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/RouteFactory.java
index cadab64..b419f8b 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/RouteFactory.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/RouteFactory.java
@@ -34,10 +34,12 @@ public interface RouteFactory {
      * @param  routeId          the route id
      * @param  routeDescription the route description
      * @param  endpoint         the input endpoint (consumer)
+     * @param  resource         the source resource (if loaded via a DSL 
routes loader)
      * @return                  the created route
      */
     Route createRoute(
             CamelContext camelContext, NamedNode routeDefinition,
-            String routeId, String routeDescription, Endpoint endpoint);
+            String routeId, String routeDescription, Endpoint endpoint,
+            Resource resource);
 
 }
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 0c3b44b..3ebc21f 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -3068,8 +3068,13 @@ public abstract class AbstractCamelContext extends 
BaseService
                 // use basic endpoint uri to not log verbose details or 
potential sensitive data
                 String uri = 
order.getRoute().getEndpoint().getEndpointBaseUri();
                 uri = URISupport.sanitizeUri(uri);
-                lines.add(String.format("    %s %s (%s)", status, id, uri));
-
+                String loc = order.getRoute().getSourceResource() != null
+                        ? order.getRoute().getSourceResource().getLocation() : 
null;
+                if (startupSummaryLevel == StartupSummaryLevel.Verbose && loc 
!= null) {
+                    lines.add(String.format("    %s %s (%s) (source: %s)", 
status, id, uri, loc));
+                } else {
+                    lines.add(String.format("    %s %s (%s)", status, id, 
uri));
+                }
                 String cid = order.getRoute().getConfigurationId();
                 if (cid != null) {
                     configs.add(String.format("    %s (%s)", id, cid));
@@ -3087,7 +3092,12 @@ public abstract class AbstractCamelContext extends 
BaseService
                     // use basic endpoint uri to not log verbose details or 
potential sensitive data
                     String uri = route.getEndpoint().getEndpointBaseUri();
                     uri = URISupport.sanitizeUri(uri);
-                    lines.add(String.format("    %s %s (%s)", status, id, 
uri));
+                    String loc = route.getSourceResource() != null ? 
route.getSourceResource().getLocation() : null;
+                    if (startupSummaryLevel == StartupSummaryLevel.Verbose && 
loc != null) {
+                        lines.add(String.format("    %s %s (%s) (source: %s)", 
status, id, uri, loc));
+                    } else {
+                        lines.add(String.format("    %s %s (%s)", status, id, 
uri));
+                    }
 
                     String cid = route.getConfigurationId();
                     if (cid != null) {
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
index 716ad28..377c1a5 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
@@ -43,6 +43,7 @@ import org.apache.camel.SuspendableService;
 import org.apache.camel.spi.IdAware;
 import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.ManagementInterceptStrategy;
+import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RouteController;
 import org.apache.camel.spi.RouteError;
 import org.apache.camel.spi.RouteIdAware;
@@ -66,6 +67,7 @@ public class DefaultRoute extends ServiceSupport implements 
Route {
     private NamedNode route;
     private final String routeId;
     private final String routeDescription;
+    private final Resource sourceResource;
     private final List<Processor> eventDrivenProcessors = new ArrayList<>();
     private final List<InterceptStrategy> interceptStrategies = new 
ArrayList<>(0);
     private ManagementInterceptStrategy managementInterceptStrategy;
@@ -100,12 +102,13 @@ public class DefaultRoute extends ServiceSupport 
implements Route {
     private Consumer consumer;
 
     public DefaultRoute(CamelContext camelContext, NamedNode route, String 
routeId,
-                        String routeDescription, Endpoint endpoint) {
+                        String routeDescription, Endpoint endpoint, Resource 
resource) {
         this.camelContext = camelContext;
         this.route = route;
         this.routeId = routeId;
         this.routeDescription = routeDescription;
         this.endpoint = endpoint;
+        this.sourceResource = resource;
     }
 
     @Override
@@ -168,6 +171,11 @@ public class DefaultRoute extends ServiceSupport 
implements Route {
     }
 
     @Override
+    public Resource getSourceResource() {
+        return sourceResource;
+    }
+
+    @Override
     public void initializeServices() throws Exception {
         // gather all the services for this route
         gatherServices(services);
@@ -631,7 +639,7 @@ public class DefaultRoute extends ServiceSupport implements 
Route {
     public Navigate<Processor> navigate() {
         Processor answer = getProcessor();
 
-        // we want navigating routes to be easy, so skip the initial channel
+        // we want to navigate routes to be easy, so skip the initial channel
         // and navigate to its output where it all starts from end user point 
of view
         if (answer instanceof Navigate) {
             Navigate<Processor> nav = (Navigate<Processor>) answer;
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRouteFactory.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRouteFactory.java
index 52a422c..c607558 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRouteFactory.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRouteFactory.java
@@ -20,6 +20,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Route;
+import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RouteFactory;
 
 /**
@@ -29,7 +30,8 @@ public class DefaultRouteFactory implements RouteFactory {
 
     @Override
     public Route createRoute(
-            CamelContext camelContext, NamedNode routeDefinition, String 
routeId, String routeDescription, Endpoint endpoint) {
-        return new DefaultRoute(camelContext, routeDefinition, routeId, 
routeDescription, endpoint);
+            CamelContext camelContext, NamedNode routeDefinition, String 
routeId, String routeDescription,
+            Endpoint endpoint, Resource resource) {
+        return new DefaultRoute(camelContext, routeDefinition, routeId, 
routeDescription, endpoint, resource);
     }
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
index 045b003..f3ae520 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
@@ -65,6 +65,7 @@ import org.slf4j.LoggerFactory;
 public abstract class RouteBuilder extends BuilderSupport implements 
RoutesBuilder, Ordered {
     protected Logger log = LoggerFactory.getLogger(getClass());
 
+    private Resource resource;
     private final AtomicBoolean initialized = new AtomicBoolean();
     private final List<RouteBuilderLifecycleStrategy> lifecycleInterceptors = 
new ArrayList<>();
     private final List<TransformerBuilder> transformerBuilders = new 
ArrayList<>();
@@ -84,6 +85,20 @@ public abstract class RouteBuilder extends BuilderSupport 
implements RoutesBuild
     }
 
     /**
+     * The {@link Resource} which is the source code for this route (such as 
XML, YAML, Groovy or Java source file)
+     */
+    public Resource getResource() {
+        return resource;
+    }
+
+    /**
+     * Sets the {@link Resource} which is the source code for this route (such 
as XML, YAML, Groovy or Java source file)
+     */
+    public void setResource(Resource resource) {
+        this.resource = resource;
+    }
+
+    /**
      * Add routes to a context using a lambda expression. It can be used as 
following:
      *
      * <pre>
@@ -591,6 +606,9 @@ public abstract class RouteBuilder extends BuilderSupport 
implements RoutesBuild
 
             configure();
 
+            // remember the source resource
+            getRouteCollection().setResource(getResource());
+
             for (RouteDefinition route : getRouteCollection().getRoutes()) {
                 // ensure the route is prepared after configure method is 
complete
                 getRouteCollection().prepareRoute(route);
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java
index ea473a2..91c7b66 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java
@@ -46,6 +46,7 @@ import org.apache.camel.model.rest.RestBindingDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.spi.AsEndpointUri;
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RoutePolicy;
 
 /**
@@ -88,6 +89,7 @@ public class RouteDefinition extends 
OutputDefinition<RouteDefinition> implement
     private List<PropertyDefinition> routeProperties;
     private Map<String, Object> templateParameters;
     private RouteTemplateContext routeTemplateContext;
+    private Resource resource;
 
     public RouteDefinition() {
     }
@@ -702,6 +704,15 @@ public class RouteDefinition extends 
OutputDefinition<RouteDefinition> implement
         this.routeTemplateContext = routeTemplateContext;
     }
 
+    public Resource getResource() {
+        return resource;
+    }
+
+    @XmlTransient
+    public void setResource(Resource resource) {
+        this.resource = resource;
+    }
+
     // Properties
     // -----------------------------------------------------------------------
 
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
index 02bd6be..fce66a6 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesDefinition.java
@@ -32,6 +32,7 @@ import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.builder.EndpointConsumerBuilder;
 import org.apache.camel.spi.AsEndpointUri;
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.Resource;
 import org.apache.camel.support.OrderedComparator;
 import org.apache.camel.support.PatternHelper;
 import org.slf4j.Logger;
@@ -64,6 +65,8 @@ public class RoutesDefinition extends 
OptionalIdentifiedDefinition<RoutesDefinit
     private CamelContext camelContext;
     @XmlTransient
     private ErrorHandlerFactory errorHandlerFactory;
+    @XmlTransient
+    private Resource resource;
 
     public RoutesDefinition() {
     }
@@ -151,6 +154,14 @@ public class RoutesDefinition extends 
OptionalIdentifiedDefinition<RoutesDefinit
         this.errorHandlerFactory = errorHandlerFactory;
     }
 
+    public Resource getResource() {
+        return resource;
+    }
+
+    public void setResource(Resource resource) {
+        this.resource = resource;
+    }
+
     // Fluent API
     // 
-------------------------------------------------------------------------
 
@@ -222,6 +233,9 @@ public class RoutesDefinition extends 
OptionalIdentifiedDefinition<RoutesDefinit
         // reset before preparing route
         route.resetPrepare();
 
+        // remember the source resource
+        route.setResource(resource);
+
         // merge global and route scoped together
         List<OnExceptionDefinition> oe = new ArrayList<>(onExceptions);
         List<InterceptDefinition> icp = new ArrayList<>(intercepts);
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java
index d55b699..b13b98b 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java
@@ -99,7 +99,7 @@ public class RouteReifier extends 
ProcessorReifier<RouteDefinition> {
         String id = 
definition.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
         String desc = definition.getDescriptionText();
         Route route = 
camelContext.adapt(ExtendedCamelContext.class).getRouteFactory().createRoute(camelContext,
 definition, id,
-                desc, endpoint);
+                desc, endpoint, definition.getResource());
 
         // configure error handler
         route.setErrorHandlerFactory(definition.getErrorHandlerFactory());
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategyTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategyTest.java
index 1c795c5..7889cc3 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategyTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/processor/exceptionpolicy/DefaultExceptionPolicyStrategyTest.java
@@ -55,7 +55,7 @@ public class DefaultExceptionPolicyStrategyTest {
 
     private ExceptionPolicy exceptionPolicy(Class<? extends Throwable> 
exceptionClass) {
         CamelContext cc = new DefaultCamelContext();
-        Route context = new DefaultRoute(cc, null, null, null, null);
+        Route context = new DefaultRoute(cc, null, null, null, null, null);
         return new DefaultErrorHandlerReifier<>(context, null)
                 .createExceptionPolicy(new 
OnExceptionDefinition(exceptionClass));
     }
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/reifier/ProcessorReifierTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/reifier/ProcessorReifierTest.java
index 22f8af0..89ce12b 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/reifier/ProcessorReifierTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/reifier/ProcessorReifierTest.java
@@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test;
 public class ProcessorReifierTest {
     @Test
     public void testHandleCustomProcessorDefinition() {
-        Route ctx = new DefaultRoute(null, null, null, null, null);
+        Route ctx = new DefaultRoute(null, null, null, null, null, null);
         ProcessorReifier.registerReifier(MyProcessorDefinition.class, 
ProcessReifier::new);
         ProcessReifier ref = (ProcessReifier) ProcessorReifier.reifier(ctx, 
new MyProcessorDefinition());
         Assertions.assertTrue(ref.definition instanceof MyProcessorDefinition);
diff --git 
a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointRouteBuilder.java
 
b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointRouteBuilder.java
index 77ad7fc..82dbc21 100644
--- 
a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointRouteBuilder.java
+++ 
b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/EndpointRouteBuilder.java
@@ -73,6 +73,7 @@ public abstract class EndpointRouteBuilder extends 
RouteBuilder implements Endpo
             @Override
             public void configure() throws Exception {
                 CamelContextAware.trySetCamelContext(resource, getContext());
+                setResource(resource);
 
                 try (Reader reader = resource.getReader()) {
                     consumer.accept(reader, this);
diff --git 
a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
 
b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
index e019e88..dc0ef4b 100644
--- 
a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
+++ 
b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
@@ -35,6 +35,9 @@ public interface ManagedRouteMBean extends 
ManagedPerformanceCounterMBean {
     @ManagedAttribute(description = "Route Description")
     String getDescription();
 
+    @ManagedAttribute(description = "Route Source Location")
+    String getSourceLocation();
+
     @ManagedAttribute(description = "Route Configuration ID")
     String getRouteConfigurationId();
 
diff --git 
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
 
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
index 988dc20..c022566 100644
--- 
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
+++ 
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
@@ -72,6 +72,7 @@ public class ManagedRoute extends ManagedPerformanceCounter 
implements TimerList
     protected final Route route;
     protected final String description;
     protected final String configurationId;
+    protected final String sourceLocation;
     protected final CamelContext context;
     private final LoadTriplet load = new LoadTriplet();
     private final String jmxDomain;
@@ -81,6 +82,7 @@ public class ManagedRoute extends ManagedPerformanceCounter 
implements TimerList
         this.context = context;
         this.description = route.getDescription();
         this.configurationId = route.getConfigurationId();
+        this.sourceLocation = route.getSourceResource() != null ? 
route.getSourceResource().getLocation() : null;
         this.jmxDomain = 
context.getManagementStrategy().getManagementAgent().getMBeanObjectDomainName();
     }
 
@@ -145,6 +147,11 @@ public class ManagedRoute extends 
ManagedPerformanceCounter implements TimerList
     }
 
     @Override
+    public String getSourceLocation() {
+        return sourceLocation;
+    }
+
+    @Override
     public String getRouteConfigurationId() {
         return configurationId;
     }
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
index b974eb7..60a1afc 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
@@ -27,6 +27,7 @@ import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.StartupSummaryLevel;
+import org.apache.camel.spi.Resource;
 import org.apache.camel.util.AntPathMatcher;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.ObjectHelper;
@@ -119,70 +120,82 @@ public class RouteWatcherReloadStrategy extends 
FileWatcherResourceReloadStrateg
         if (getResourceReload() == null) {
             // attach listener that triggers the route update
             setResourceReload((name, resource) -> {
-                try {
-                    // should all existing routes be stopped and removed first?
-                    if (removeAllRoutes) {
-                        // first stop and remove all routes
-                        
getCamelContext().getRouteController().removeAllRoutes();
-                        // remove left-over route templates and endpoints, so 
we can start on a fresh
-                        getCamelContext().removeRouteTemplates("*");
-                        getCamelContext().getEndpointRegistry().clear();
-                    }
-                    Set<String> ids
-                            = 
getCamelContext().adapt(ExtendedCamelContext.class).getRoutesLoader().updateRoutes(resource);
-                    if (!ids.isEmpty()) {
-                        List<String> lines = new ArrayList<>();
-                        int total = 0;
-                        int started = 0;
-                        for (String id : ids) {
-                            total++;
-                            String status = 
getCamelContext().getRouteController().getRouteStatus(id).name();
-                            if (ServiceStatus.Started.name().equals(status)) {
-                                started++;
-                            }
-                            // use basic endpoint uri to not log verbose 
details or potential sensitive data
-                            String uri = 
getCamelContext().getRoute(id).getEndpoint().getEndpointBaseUri();
-                            uri = URISupport.sanitizeUri(uri);
-                            lines.add(String.format("    %s %s (%s)", status, 
id, uri));
-                        }
-                        LOG.info(String.format("Routes reloaded summary 
(total:%s started:%s)", total, started));
-                        // if we are default/verbose then log each route line
-                        if (getCamelContext().getStartupSummaryLevel() == 
StartupSummaryLevel.Default
-                                || getCamelContext().getStartupSummaryLevel() 
== StartupSummaryLevel.Verbose) {
-                            for (String line : lines) {
-                                LOG.info(line);
-                            }
-                        }
+                if (name.endsWith(".properties")) {
+                    onPropertiesReload(name, resource);
+                } else {
+                    onRouteReload(name, resource);
+                }
+            });
+        }
+
+        super.doStart();
+    }
+
+    protected void onRouteReload(String name, Resource resource) {
+        try {
+            // should all existing routes be stopped and removed first?
+            if (removeAllRoutes) {
+                // first stop and remove all routes
+                getCamelContext().getRouteController().removeAllRoutes();
+                // remove left-over route templates and endpoints, so we can 
start on a fresh
+                getCamelContext().removeRouteTemplates("*");
+                getCamelContext().getEndpointRegistry().clear();
+            }
+            Set<String> ids
+                    = 
getCamelContext().adapt(ExtendedCamelContext.class).getRoutesLoader().updateRoutes(resource);
+            if (!ids.isEmpty()) {
+                List<String> lines = new ArrayList<>();
+                int total = 0;
+                int started = 0;
+                for (String id : ids) {
+                    total++;
+                    String status = 
getCamelContext().getRouteController().getRouteStatus(id).name();
+                    if (ServiceStatus.Started.name().equals(status)) {
+                        started++;
                     }
-                    // fire events for routes reloaded
-                    for (String id : ids) {
-                        Route route = getCamelContext().getRoute(id);
-                        EventHelper.notifyRouteReloaded(getCamelContext(), 
route);
+                    // use basic endpoint uri to not log verbose details or 
potential sensitive data
+                    String uri = 
getCamelContext().getRoute(id).getEndpoint().getEndpointBaseUri();
+                    uri = URISupport.sanitizeUri(uri);
+                    lines.add(String.format("    %s %s (%s)", status, id, 
uri));
+                }
+                LOG.info(String.format("Routes reloaded summary (total:%s 
started:%s)", total, started));
+                // if we are default/verbose then log each route line
+                if (getCamelContext().getStartupSummaryLevel() == 
StartupSummaryLevel.Default
+                        || getCamelContext().getStartupSummaryLevel() == 
StartupSummaryLevel.Verbose) {
+                    for (String line : lines) {
+                        LOG.info(line);
                     }
-
-                    if (!removeAllRoutes) {
-                        // if not all previous routes are removed then to have 
safe route reloading
-                        // it is recommended to configure ids on the routes
-                        StringJoiner sj = new StringJoiner("\n    ");
-                        for (String id : ids) {
-                            Route route = getCamelContext().getRoute(id);
-                            if (route.isCustomId()) {
-                                sj.add(route.getEndpoint().getEndpointUri());
-                            }
-                        }
-                        if (sj.length() > 0) {
-                            LOG.warn(
-                                    "Routes with no id's detected. Its 
recommended to assign route id's to your routes so Camel can reload the routes 
correctly.\n    Unassigned routes:\n    {}",
-                                    sj);
-                        }
+                }
+            }
+            // fire events for routes reloaded
+            for (String id : ids) {
+                Route route = getCamelContext().getRoute(id);
+                EventHelper.notifyRouteReloaded(getCamelContext(), route);
+            }
+
+            if (!removeAllRoutes) {
+                // if not all previous routes are removed then to have safe 
route reloading
+                // it is recommended to configure ids on the routes
+                StringJoiner sj = new StringJoiner("\n    ");
+                for (String id : ids) {
+                    Route route = getCamelContext().getRoute(id);
+                    if (route.isCustomId()) {
+                        sj.add(route.getEndpoint().getEndpointUri());
                     }
-                } catch (Exception e) {
-                    throw RuntimeCamelException.wrapRuntimeException(e);
                 }
-            });
+                if (sj.length() > 0) {
+                    LOG.warn(
+                            "Routes with no id's detected. Its recommended to 
assign route id's to your routes so Camel can reload the routes correctly.\n    
Unassigned routes:\n    {}",
+                            sj);
+                }
+            }
+        } catch (Exception e) {
+            throw RuntimeCamelException.wrapRuntimeException(e);
         }
+    }
 
-        super.doStart();
+    protected void onPropertiesReload(String name, Resource resource) {
+        // TODO: implement me
     }
 
 }
diff --git 
a/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/RouteBuilderLoaderSupport.java
 
b/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/RouteBuilderLoaderSupport.java
index b0b846e..4340378 100644
--- 
a/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/RouteBuilderLoaderSupport.java
+++ 
b/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/RouteBuilderLoaderSupport.java
@@ -59,6 +59,7 @@ public abstract class RouteBuilderLoaderSupport extends 
RoutesBuilderLoaderSuppo
     public RoutesBuilder loadRoutesBuilder(Resource resource) throws Exception 
{
         final RouteBuilder builder = doLoadRouteBuilder(resource);
         CamelContextAware.trySetCamelContext(builder, getCamelContext());
+        builder.setResource(resource);
 
         if (recorder != null) {
             StartupStep step = recorder.beginStep(
diff --git 
a/dsl/camel-kamelet-main/src/test/java/org/apache/camel/main/KameletMainTest.java
 
b/dsl/camel-kamelet-main/src/test/java/org/apache/camel/main/KameletMainTest.java
index 2592e70..7fbcf7c 100644
--- 
a/dsl/camel-kamelet-main/src/test/java/org/apache/camel/main/KameletMainTest.java
+++ 
b/dsl/camel-kamelet-main/src/test/java/org/apache/camel/main/KameletMainTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.main;
 
+import org.apache.camel.StartupSummaryLevel;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
@@ -35,6 +36,7 @@ public class KameletMainTest {
     @Test
     public void testReload() throws Exception {
         KameletMain main = new KameletMain();
+        main.configure().setStartupSummaryLevel(StartupSummaryLevel.Verbose);
         main.setDownload(true);
         main.configure().withDurationMaxMessages(10);
         main.configure().withDurationMaxAction("stop");

Reply via email to