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 2024/02/15 18:29:02 UTC
(camel) branch main updated: Multi route loader (#13135)
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
The following commit(s) were added to refs/heads/main by this push:
new 78bd6d70f5a Multi route loader (#13135)
78bd6d70f5a is described below
commit 78bd6d70f5af6997d3b4a21085b1bbbde4e2cf70
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Feb 15 19:28:55 2024 +0100
Multi route loader (#13135)
CAMEL-20245: camel-yaml-dsl - Add support for multi extension
---
.../org/apache/camel/spi/RoutesBuilderLoader.java | 7 ++++
.../camel/impl/engine/DefaultRoutesLoader.java | 20 ++++++++++--
.../dsl/support/RouteBuilderLoaderSupport.java | 7 ++++
.../org/apache/camel/routes-loader/camel-yaml | 2 --
.../org/apache/camel/routes-loader/camel.yaml | 2 --
.../org/apache/camel/routes-loader/camelk-yaml | 2 --
.../org/apache/camel/routes-loader/camelk.yaml | 2 --
.../org/apache/camel/routes-loader/kamelet.yaml | 2 --
.../dsl/yaml/CamelKYamlRoutesBuilderLoader.java | 37 ----------------------
.../dsl/yaml/CamelYamlRoutesBuilderLoader.java | 31 ------------------
.../camel/dsl/yaml/YamlRoutesBuilderLoader.java | 21 +++++++++++-
.../apache/camel/dsl/yaml/PipeLoaderTest.groovy | 4 +--
.../camel/dsl/yaml/support/YamlTestSupport.groovy | 10 ++++++
13 files changed, 64 insertions(+), 83 deletions(-)
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/RoutesBuilderLoader.java b/core/camel-api/src/main/java/org/apache/camel/spi/RoutesBuilderLoader.java
index 6bb3bb7e201..6878e0df645 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/RoutesBuilderLoader.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/RoutesBuilderLoader.java
@@ -37,6 +37,13 @@ public interface RoutesBuilderLoader extends StaticService, CamelContextAware {
*/
String getSupportedExtension();
+ /**
+ * Whether the file extension is supported
+ */
+ default boolean isSupportedExtension(String extension) {
+ return getSupportedExtension().equals(extension);
+ }
+
/**
* Loads {@link RoutesBuilder} from {@link Resource}.
*
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 560e0db7346..3270da91b8d 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
@@ -231,7 +231,11 @@ public class DefaultRoutesLoader extends ServiceSupport implements RoutesLoader,
RoutesBuilderLoader.class);
if (answer == null) {
- answer = loaders.computeIfAbsent(extension, this::resolveService);
+ answer = loaders.values().stream()
+ // find existing loader that support this extension
+ .filter(l -> l.isSupportedExtension(extension)).findFirst()
+ // or resolve loader from classpath
+ .orElse(loaders.computeIfAbsent(extension, this::resolveService));
}
return answer;
@@ -247,8 +251,20 @@ public class DefaultRoutesLoader extends ServiceSupport implements RoutesLoader,
final CamelContext ecc = getCamelContext();
final FactoryFinder finder = ecc.getCamelContextExtension().getBootstrapFactoryFinder(RoutesBuilderLoader.FACTORY_PATH);
+ // the marker files are generated with dot as dash
+ String sanitized = extension.replace(".", "-");
RoutesBuilderLoader answer
- = ResolverHelper.resolveService(getCamelContext(), finder, extension, RoutesBuilderLoader.class).orElse(null);
+ = ResolverHelper.resolveService(getCamelContext(), finder, sanitized, RoutesBuilderLoader.class).orElse(null);
+
+ // if it's a multi-extension then fallback to parent
+ if (answer == null && extension.contains(".")) {
+ String single = FileUtil.onlyExt(extension, true);
+ answer = ResolverHelper.resolveService(getCamelContext(), finder, single, RoutesBuilderLoader.class).orElse(null);
+ if (answer != null && !answer.isSupportedExtension(extension)) {
+ // okay we cannot support this extension as fallback
+ answer = null;
+ }
+ }
if (answer != null) {
CamelContextAware.trySetCamelContext(answer, getCamelContext());
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 b5b452860a7..2c3a8b237e6 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
@@ -28,6 +28,7 @@ import org.apache.camel.CamelContextAware;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.StartupStep;
import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedOperation;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.builder.RouteBuilderLifecycleStrategy;
import org.apache.camel.spi.CompilePostProcessor;
@@ -55,6 +56,12 @@ public abstract class RouteBuilderLoaderSupport extends RoutesBuilderLoaderSuppo
return extension;
}
+ @ManagedOperation(description = "Is the file extension supported by this route loader")
+ @Override
+ public boolean isSupportedExtension(String extension) {
+ return super.isSupportedExtension(extension);
+ }
+
/**
* Gets the registered {@link CompilePostProcessor}.
*/
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camel-yaml b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camel-yaml
deleted file mode 100644
index 99b1490d923..00000000000
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camel-yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.dsl.yaml.CamelYamlRoutesBuilderLoader
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camel.yaml b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camel.yaml
deleted file mode 100644
index 99b1490d923..00000000000
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camel.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.dsl.yaml.CamelYamlRoutesBuilderLoader
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camelk-yaml b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camelk-yaml
deleted file mode 100644
index aa182116b9f..00000000000
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camelk-yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.dsl.yaml.CamelKYamlRoutesBuilderLoader
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camelk.yaml b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camelk.yaml
deleted file mode 100644
index aa182116b9f..00000000000
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/camelk.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.dsl.yaml.CamelKYamlRoutesBuilderLoader
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/kamelet.yaml b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/kamelet.yaml
deleted file mode 100644
index 867db7d6205..00000000000
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/META-INF/services/org/apache/camel/routes-loader/kamelet.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.dsl.yaml.KameletRoutesBuilderLoader
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/CamelKYamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/CamelKYamlRoutesBuilderLoader.java
deleted file mode 100644
index be64986add9..00000000000
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/CamelKYamlRoutesBuilderLoader.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.dsl.yaml;
-
-import org.apache.camel.api.management.ManagedResource;
-import org.apache.camel.spi.annotations.RoutesLoader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@ManagedResource(description = "Managed CamelK YAML RoutesBuilderLoader")
-@RoutesLoader(CamelKYamlRoutesBuilderLoader.EXTENSION)
-@Deprecated
-public class CamelKYamlRoutesBuilderLoader extends YamlRoutesBuilderLoader {
-
- private static final Logger LOG = LoggerFactory.getLogger(CamelKYamlRoutesBuilderLoader.class);
-
- public static final String EXTENSION = "camelk.yaml";
-
- public CamelKYamlRoutesBuilderLoader() {
- super(EXTENSION);
- LOG.warn("Camel routes in files with extension .camelk.yaml is deprecated. Use .camel.yaml instead.");
- }
-}
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/CamelYamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/CamelYamlRoutesBuilderLoader.java
deleted file mode 100644
index fd6d754926e..00000000000
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/CamelYamlRoutesBuilderLoader.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.dsl.yaml;
-
-import org.apache.camel.api.management.ManagedResource;
-import org.apache.camel.spi.annotations.RoutesLoader;
-
-@ManagedResource(description = "Managed Camel YAML RoutesBuilderLoader")
-@RoutesLoader(CamelYamlRoutesBuilderLoader.EXTENSION)
-public class CamelYamlRoutesBuilderLoader extends YamlRoutesBuilderLoader {
-
- public static final String EXTENSION = "camel.yaml";
-
- public CamelYamlRoutesBuilderLoader() {
- super(EXTENSION);
- }
-}
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
index 0e3b68f4308..b9d6fbb0a4a 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
@@ -19,6 +19,7 @@ package org.apache.camel.dsl.yaml;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -26,6 +27,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.camel.CamelContext;
import org.apache.camel.CamelContextAware;
@@ -96,9 +98,14 @@ import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.setDeseri
public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
public static final String EXTENSION = "yaml";
+ public static final String[] SUPPORTED_EXTENSION = { EXTENSION, "camel.yaml", "pipe.yaml" };
+ private static final String DEPRECATED_EXTENSION = "camelk.yaml";
private static final Logger LOG = LoggerFactory.getLogger(YamlRoutesBuilderLoader.class);
+ private final AtomicBoolean deprecatedWarnLogged = new AtomicBoolean();
+ private final AtomicBoolean deprecatedBindingWarnLogged = new AtomicBoolean();
+
// API versions for Camel-K Integration and Pipe
// we are lenient so lets just assume we can work with any of the v1 even if they evolve
private static final String INTEGRATION_VERSION = "camel.apache.org/v1";
@@ -120,6 +127,18 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
super(extension);
}
+ @Override
+ public boolean isSupportedExtension(String extension) {
+ // this builder can support multiple extensions
+ if (DEPRECATED_EXTENSION.equals(extension)) {
+ if (deprecatedWarnLogged.compareAndSet(false, true)) {
+ LOG.warn("File extension camelk.yaml is deprecated. Use camel.yaml instead.");
+ }
+ return true;
+ }
+ return Arrays.asList(SUPPORTED_EXTENSION).contains(extension);
+ }
+
protected RouteBuilder builder(final YamlDeserializationContext ctx, final Node root) {
// we need to keep track of already configured items as the yaml-dsl returns a
@@ -330,7 +349,7 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
if (integration) {
target = preConfigureIntegration(root, ctx, target, preParse);
} else if (binding || pipe) {
- if (binding) {
+ if (binding && deprecatedBindingWarnLogged.compareAndSet(false, true)) {
LOG.warn("CamelK kind=KameletBinding is deprecated. Use CamelK kind=Pipe instead.");
}
target = preConfigurePipe(root, ctx, target, preParse);
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy
index e917ed7c719..858b8df4f72 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/PipeLoaderTest.groovy
@@ -33,9 +33,9 @@ class PipeLoaderTest extends YamlTestSupport {
context.start()
}
- def "Pipe from kamelet to kamelet"() {
+ def "Pipe from kamelet to kamelet with pipe.yaml extension"() {
when:
- loadBindings('''
+ loadBindingsExt("pipe.yaml", '''
apiVersion: camel.apache.org/v1
kind: Pipe
metadata:
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
index 0114841fe4d..ba4f063e44b 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
@@ -147,6 +147,16 @@ class YamlTestSupport extends Specification implements HasCamelContext {
)
}
+ def loadBindingsExt(String ext, String... resources) {
+ int index = 0
+
+ PluginHelper.getRoutesLoader(context).loadRoutes(
+ resources.collect {
+ it -> ResourceHelper.fromString("binding-${index++}." + ext, it.stripIndent())
+ }
+ )
+ }
+
def withMock(
String uri,
@DelegatesTo(MockEndpoint) Closure<?> closure) {