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 <claus.ib...@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) {