You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/08/28 18:41:55 UTC

[camel] 01/03: CAMEL-19795: camel-joor-dsl: Make it possible to eager preParse all .java files together in the same compilation unit.

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

davsclaus pushed a commit to branch java-dsl-eager
in repository https://gitbox.apache.org/repos/asf/camel.git

commit f884bb3446a0f94a62c75860dff6e6f574478d84
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Aug 28 19:15:03 2023 +0200

    CAMEL-19795: camel-joor-dsl: Make it possible to eager preParse all .java files together in the same compilation unit.
---
 .../camel/spi/ExtendedRoutesBuilderLoader.java     | 15 ++++++++
 .../java/org/apache/camel/spi/ModelineFactory.java |  2 +
 .../camel/impl/engine/DefaultRoutesLoader.java     | 44 ++++++++++++++++------
 3 files changed, 50 insertions(+), 11 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/ExtendedRoutesBuilderLoader.java b/core/camel-api/src/main/java/org/apache/camel/spi/ExtendedRoutesBuilderLoader.java
index 8528775e58e..06ca1520206 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/ExtendedRoutesBuilderLoader.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/ExtendedRoutesBuilderLoader.java
@@ -26,6 +26,21 @@ import org.apache.camel.RoutesBuilder;
  */
 public interface ExtendedRoutesBuilderLoader extends RoutesBuilderLoader {
 
+    /**
+     * Pre-parses the {@link RoutesBuilder} from multiple {@link Resource}s.
+     *
+     * This is used during bootstrap, to eager detect configurations from route DSL resources which makes it possible to
+     * specify configurations that affect the bootstrap, such as by camel-jbang and camel-yaml-dsl.
+     *
+     * @param resources the resources to be pre parsed.
+     */
+    default void preParseRoutes(Collection<Resource> resources) throws Exception {
+        // by default parse one-by-one
+        for (Resource resource : resources) {
+            preParseRoute(resource);
+        }
+    }
+
     /**
      * Loads {@link RoutesBuilder} from multiple {@link Resource}s.
      *
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/ModelineFactory.java b/core/camel-api/src/main/java/org/apache/camel/spi/ModelineFactory.java
index 35b8bae5d5d..436cf27a047 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/ModelineFactory.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/ModelineFactory.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.spi;
 
+import java.util.Collection;
+
 /**
  * Factory for parsing camel-k modeline when running Camel standalone with DSLs.
  */
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
index ecf43bfa44b..e1ad639b970 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
@@ -92,9 +92,42 @@ public class DefaultRoutesLoader extends ServiceSupport implements RoutesLoader,
     public Collection<RoutesBuilder> findRoutesBuilders(Collection<Resource> resources, boolean optional) throws Exception {
         List<RoutesBuilder> answer = new ArrayList<>(resources.size());
 
+        // group resources by loader (java, xml, yaml in their own group)
+        Map<RoutesBuilderLoader, List<Resource>> groups = new LinkedHashMap<>();
+        for (Resource resource : resources) {
+            RoutesBuilderLoader loader = resolveRoutesBuilderLoader(resource, optional);
+            if (loader != null) {
+                List<Resource> list = groups.getOrDefault(loader, new ArrayList<>());
+                list.add(resource);
+                groups.put(loader, list);
+            }
+        }
+
         // first we need to parse for modeline to gather all the configurations
         if (camelContext.isModeline()) {
             ModelineFactory factory = PluginHelper.getModelineFactory(camelContext);
+
+            for (Map.Entry<RoutesBuilderLoader, List<Resource>> entry : groups.entrySet()) {
+                RoutesBuilderLoader loader = entry.getKey();
+                if (loader instanceof ExtendedRoutesBuilderLoader) {
+                    // parse modelines for all resources
+                    for (Resource resource : entry.getValue()) {
+                        factory.parseModeline(resource);
+                    }
+                    // extended loader can load all resources ine one unit
+                    ExtendedRoutesBuilderLoader extLoader = (ExtendedRoutesBuilderLoader) loader;
+                    // pre-parse before loading
+                    extLoader.preParseRoutes(entry.getValue());
+                } else {
+                    for (Resource resource : entry.getValue()) {
+                        RoutesBuilder builder = loader.loadRoutesBuilder(resource);
+                        if (builder != null) {
+                            answer.add(builder);
+                        }
+                    }
+                }
+            }
+
             for (Resource resource : resources) {
                 try (RoutesBuilderLoader loader = resolveRoutesBuilderLoader(resource, optional)) {
                     if (loader != null) {
@@ -107,17 +140,6 @@ public class DefaultRoutesLoader extends ServiceSupport implements RoutesLoader,
             }
         }
 
-        // now group resources by loader
-        Map<RoutesBuilderLoader, List<Resource>> groups = new LinkedHashMap<>();
-        for (Resource resource : resources) {
-            RoutesBuilderLoader loader = resolveRoutesBuilderLoader(resource, optional);
-            if (loader != null) {
-                List<Resource> list = groups.getOrDefault(loader, new ArrayList<>());
-                list.add(resource);
-                groups.put(loader, list);
-            }
-        }
-
         // now load all the same resources for each loader
         for (Map.Entry<RoutesBuilderLoader, List<Resource>> entry : groups.entrySet()) {
             RoutesBuilderLoader loader = entry.getKey();