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();