This is an automated email from the ASF dual-hosted git repository. lburgazzoli pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/master by this push: new f3e6fce Modular RoutesCollector f3e6fce is described below commit f3e6fce8cd727f577914cd43f03c486326079350 Author: lburgazzoli <lburgazz...@gmail.com> AuthorDate: Wed Dec 18 21:30:06 2019 +0100 Modular RoutesCollector The aim here is to make the RoutesCollector more flexible so platform such as camel-k can fine tune the behavior of the collector i.e. by providing am ad-hoc way of discovery certain routes from the registry --- .../component/xml/deployment/XmlProcessor.java | 13 +-- ...tXmlLoader.java => DefaultXmlRoutesLoader.java} | 4 +- .../camel/quarkus/component/xml/XmlRecorder.java | 12 +-- .../quarkus/core/deployment/BuildProcessor.java | 31 ++++-- .../deployment/CamelRoutesLoaderBuildItems.java | 57 +++++++++++ .../camel/quarkus/core/CamelMainRecorder.java | 8 +- .../apache/camel/quarkus/core/CamelRecorder.java | 10 +- .../camel/quarkus/core/CamelRoutesCollector.java | 104 +++++++++++++++++++++ ...XmlLoader.java => DisabledXmlRoutesLoader.java} | 2 +- .../org/apache/camel/quarkus/core/FastModel.java | 4 +- .../{XmlLoader.java => RegistryRoutesLoader.java} | 13 +-- .../camel/quarkus/core/RegistryRoutesLoaders.java | 103 ++++++++++++++++++++ .../core/{XmlLoader.java => XmlRoutesLoader.java} | 2 +- integration-tests/core-main-collector/pom.xml | 94 +++++++++++++++++++ .../apache/camel/quarkus/core/CamelServlet.java | 38 +++++--- .../src/main/resources/application.properties | 22 ----- .../org/apache/camel/quarkus/core/CamelTest.java | 33 ++++--- .../{core-main => core-main-xml}/pom.xml | 26 +----- .../apache/camel/quarkus/core/CamelServlet.java | 72 ++++++++++++++ .../src/main/resources/application.properties | 18 ---- .../org/apache/camel/quarkus/core/CamelTest.java | 53 +++++++++++ .../src/test/resources/my-routes.xml | 0 integration-tests/core-main/pom.xml | 4 - .../apache/camel/quarkus/core/CamelServlet.java | 9 ++ .../src/main/resources/application.properties | 1 - .../org/apache/camel/quarkus/core/CamelTest.java | 29 +----- integration-tests/pom.xml | 7 ++ .../support/core-main-collector/deployment/pom.xml | 73 +++++++++++++++ .../core/runtime/support/deployment/Feature.java | 20 ++-- .../support/deployment/SupportBuildStep.java | 32 +++---- .../support/{ => core-main-collector}/pom.xml | 16 +--- .../support/core-main-collector/runtime/pom.xml | 71 ++++++++++++++ .../core/runtime/support/SupportRecorder.java | 24 ++--- .../runtime/support/SupportRoutesCollector.java | 23 +++-- integration-tests/support/pom.xml | 1 + 35 files changed, 797 insertions(+), 232 deletions(-) diff --git a/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java b/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java index f43af15..ec99180 100644 --- a/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java +++ b/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java @@ -23,9 +23,8 @@ import io.quarkus.deployment.builditem.FeatureBuildItem; import io.quarkus.jaxb.deployment.JaxbFileRootBuildItem; import org.apache.camel.quarkus.component.xml.XmlRecorder; import org.apache.camel.quarkus.core.deployment.CamelModelJAXBContextFactoryBuildItem; -import org.apache.camel.quarkus.core.deployment.CamelRoutesCollectorBuildItem; +import org.apache.camel.quarkus.core.deployment.CamelRoutesLoaderBuildItems; import org.apache.camel.quarkus.core.deployment.CamelSupport; -import org.apache.camel.quarkus.core.deployment.CamelXmlLoaderBuildItem; import org.apache.camel.quarkus.support.common.CamelCapabilities; class XmlProcessor { @@ -50,14 +49,8 @@ class XmlProcessor { @BuildStep @Record(value = ExecutionTime.STATIC_INIT, optional = true) - CamelXmlLoaderBuildItem xmlLoader(XmlRecorder recorder) { - return new CamelXmlLoaderBuildItem(recorder.newDefaultXmlLoader()); - } - - @BuildStep - @Record(value = ExecutionTime.STATIC_INIT, optional = true) - public CamelRoutesCollectorBuildItem routesCollector(XmlRecorder recorder) { - return new CamelRoutesCollectorBuildItem(recorder.newDefaultRoutesCollector()); + CamelRoutesLoaderBuildItems.Xml xmlLoader(XmlRecorder recorder) { + return new CamelRoutesLoaderBuildItems.Xml(recorder.newDefaultXmlLoader()); } @BuildStep diff --git a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java similarity index 92% copy from extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java copy to extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java index 67a329d..c9e1455 100644 --- a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java +++ b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java @@ -22,9 +22,9 @@ import org.apache.camel.CamelContext; import org.apache.camel.model.ModelHelper; import org.apache.camel.model.RoutesDefinition; import org.apache.camel.model.rest.RestsDefinition; -import org.apache.camel.quarkus.core.XmlLoader; +import org.apache.camel.quarkus.core.XmlRoutesLoader; -public class DefaultXmlLoader implements XmlLoader { +public class DefaultXmlRoutesLoader implements XmlRoutesLoader { @Override public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream is) throws Exception { diff --git a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java index dd5acc0..0170587 100644 --- a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java +++ b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java @@ -22,11 +22,9 @@ import io.quarkus.runtime.RuntimeValue; import io.quarkus.runtime.annotations.Recorder; import org.apache.camel.RuntimeCamelException; import org.apache.camel.impl.DefaultModelJAXBContextFactory; -import org.apache.camel.main.DefaultRoutesCollector; -import org.apache.camel.main.RoutesCollector; import org.apache.camel.model.ValidateDefinition; import org.apache.camel.model.validator.PredicateValidatorDefinition; -import org.apache.camel.quarkus.core.XmlLoader; +import org.apache.camel.quarkus.core.XmlRoutesLoader; import org.apache.camel.reifier.ProcessorReifier; import org.apache.camel.reifier.ValidateReifier; import org.apache.camel.reifier.validator.PredicateValidatorReifier; @@ -49,12 +47,8 @@ public class XmlRecorder { return new RuntimeValue<>(factory); } - public RuntimeValue<XmlLoader> newDefaultXmlLoader() { - return new RuntimeValue<>(new DefaultXmlLoader()); - } - - public RuntimeValue<RoutesCollector> newDefaultRoutesCollector() { - return new RuntimeValue<>(new DefaultRoutesCollector()); + public RuntimeValue<XmlRoutesLoader> newDefaultXmlLoader() { + return new RuntimeValue<>(new DefaultXmlRoutesLoader()); } public void initXmlReifiers() { diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java index fb83ff4..8fd37d3 100644 --- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java +++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java @@ -57,7 +57,6 @@ import org.apache.camel.quarkus.core.CoreAttachmentsRecorder; import org.apache.camel.quarkus.core.Flags; import org.apache.camel.quarkus.core.UploadAttacher; import org.apache.camel.quarkus.support.common.CamelCapabilities; -import org.apache.camel.spi.Registry; import org.apache.camel.spi.TypeConverterLoader; import org.apache.camel.spi.TypeConverterRegistry; import org.jboss.jandex.ClassInfo; @@ -187,7 +186,7 @@ class BuildProcessor { List<CamelBeanBuildItem> registryItems, List<CamelServiceFilterBuildItem> serviceFilters) { - final RuntimeValue<Registry> registry = recorder.createRegistry(); + final RuntimeValue<org.apache.camel.spi.Registry> registry = recorder.createRegistry(); CamelSupport.services(applicationArchives) .filter(si -> !containerBeans.getBeans().contains(si)) @@ -238,8 +237,8 @@ class BuildProcessor { @Overridable @BuildStep @Record(value = ExecutionTime.STATIC_INIT, optional = true) - public CamelXmlLoaderBuildItem createXmlLoader(CamelRecorder recorder) { - return new CamelXmlLoaderBuildItem(recorder.newDisabledXmlLoader()); + public CamelRoutesLoaderBuildItems.Xml createXmlLoader(CamelRecorder recorder) { + return new CamelRoutesLoaderBuildItems.Xml(recorder.newDisabledXmlRoutesLoader()); } @BuildStep @@ -258,14 +257,14 @@ class BuildProcessor { CamelRegistryBuildItem registry, CamelTypeConverterRegistryBuildItem typeConverterRegistry, CamelModelJAXBContextFactoryBuildItem contextFactory, - CamelXmlLoaderBuildItem xmlLoader, + CamelRoutesLoaderBuildItems.Xml xmlLoader, BeanContainerBuildItem beanContainer) { RuntimeValue<CamelContext> context = recorder.createContext( registry.getRegistry(), typeConverterRegistry.getRegistry(), contextFactory.getContextFactory(), - xmlLoader.getXmlLoader(), + xmlLoader.getLoader(), beanContainer.getValue()); return new CamelContextBuildItem(context); @@ -301,6 +300,12 @@ class BuildProcessor { * disabled by setting quarkus.camel.disable-main = true */ public static class Main { + @Overridable + @BuildStep + @Record(value = ExecutionTime.STATIC_INIT, optional = true) + public CamelRoutesLoaderBuildItems.Registry createRegistryLoader(CamelRecorder recorder) { + return new CamelRoutesLoaderBuildItems.Registry(recorder.newDefaultRegistryRoutesLoader()); + } @BuildStep(onlyIf = { Flags.MainEnabled.class, Flags.RoutesDiscoveryEnabled.class }) public List<CamelRoutesBuilderClassBuildItem> discoverRoutesBuilderClassNames( @@ -330,8 +335,13 @@ class BuildProcessor { @Overridable @BuildStep @Record(value = ExecutionTime.STATIC_INIT, optional = true) - public CamelRoutesCollectorBuildItem createRoutesCollector(CamelMainRecorder recorder) { - return new CamelRoutesCollectorBuildItem(recorder.newDisabledXmlRoutesCollector()); + public CamelRoutesCollectorBuildItem createRoutesCollector( + CamelMainRecorder recorder, + CamelRoutesLoaderBuildItems.Registry registryRoutesLoader, + CamelRoutesLoaderBuildItems.Xml xmlRoutesLoader) { + + return new CamelRoutesCollectorBuildItem( + recorder.newRoutesCollector(registryRoutesLoader.getLoader(), xmlRoutesLoader.getLoader())); } @BuildStep(onlyIf = Flags.MainEnabled.class) @@ -399,8 +409,9 @@ class BuildProcessor { * * @param recorder the recorder. * @param main a reference to a {@link CamelMain}. - * @param registry a reference to a {@link Registry}; note that this parameter is here as placeholder to - * ensure the {@link Registry} is fully configured before starting camel-main. + * @param registry a reference to a {@link org.apache.camel.spi.Registry}; note that this parameter is here as + * placeholder to + * ensure the {@link org.apache.camel.spi.Registry} is fully configured before starting camel-main. * @param executor the {@link org.apache.camel.spi.ReactiveExecutor} to be configured on camel-main, this * happens during {@link ExecutionTime#RUNTIME_INIT} because the executor may need to start * threads and so on. diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java new file mode 100644 index 0000000..815cff7 --- /dev/null +++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java @@ -0,0 +1,57 @@ +/* + * 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.quarkus.core.deployment; + +import io.quarkus.builder.item.SimpleBuildItem; +import io.quarkus.runtime.RuntimeValue; +import org.apache.camel.quarkus.core.RegistryRoutesLoader; +import org.apache.camel.quarkus.core.XmlRoutesLoader; + +public final class CamelRoutesLoaderBuildItems { + private CamelRoutesLoaderBuildItems() { + } + + /** + * Holds the {@link RegistryRoutesLoader} instance. + */ + public static final class Registry extends SimpleBuildItem { + private final RuntimeValue<RegistryRoutesLoader> value; + + public Registry(RuntimeValue<RegistryRoutesLoader> value) { + this.value = value; + } + + public RuntimeValue<RegistryRoutesLoader> getLoader() { + return value; + } + } + + /** + * Holds the {@link XmlRoutesLoader} instance. + */ + public static final class Xml extends SimpleBuildItem { + private final RuntimeValue<XmlRoutesLoader> value; + + public Xml(RuntimeValue<XmlRoutesLoader> value) { + this.value = value; + } + + public RuntimeValue<XmlRoutesLoader> getLoader() { + return value; + } + } +} diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java index 7d4c906..484a300 100644 --- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java +++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java @@ -95,7 +95,11 @@ public class CamelMainRecorder { } } - public RuntimeValue<RoutesCollector> newDisabledXmlRoutesCollector() { - return new RuntimeValue<>(new DisabledXmlRoutesCollector()); + public RuntimeValue<RoutesCollector> newRoutesCollector( + RuntimeValue<RegistryRoutesLoader> registryRoutesLoader, + RuntimeValue<XmlRoutesLoader> xmlRoutesLoader) { + + return new RuntimeValue<>(new CamelRoutesCollector(registryRoutesLoader.getValue(), xmlRoutesLoader.getValue())); } + } diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java index c22926f..56e6304 100644 --- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java +++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java @@ -49,7 +49,7 @@ public class CamelRecorder { RuntimeValue<Registry> registry, RuntimeValue<TypeConverterRegistry> typeConverterRegistry, RuntimeValue<ModelJAXBContextFactory> contextFactory, - RuntimeValue<XmlLoader> xmlLoader, + RuntimeValue<XmlRoutesLoader> xmlLoader, BeanContainer beanContainer) { FastCamelContext context = new FastCamelContext(); context.setRegistry(registry.getValue()); @@ -106,7 +106,11 @@ public class CamelRecorder { return new RuntimeValue<>(new DisabledModelJAXBContextFactory()); } - public RuntimeValue<XmlLoader> newDisabledXmlLoader() { - return new RuntimeValue<>(new DisabledXmlLoader()); + public RuntimeValue<XmlRoutesLoader> newDisabledXmlRoutesLoader() { + return new RuntimeValue<>(new DisabledXmlRoutesLoader()); + } + + public RuntimeValue<RegistryRoutesLoader> newDefaultRegistryRoutesLoader() { + return new RuntimeValue<>(new RegistryRoutesLoaders.Default()); } } diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java new file mode 100644 index 0000000..8f63cea --- /dev/null +++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java @@ -0,0 +1,104 @@ +/* + * 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.quarkus.core; + +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.apache.camel.CamelContext; +import org.apache.camel.ExtendedCamelContext; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.main.RoutesCollector; +import org.apache.camel.model.RoutesDefinition; +import org.apache.camel.model.rest.RestsDefinition; +import org.apache.camel.spi.PackageScanResourceResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CamelRoutesCollector implements RoutesCollector { + private static final Logger LOGGER = LoggerFactory.getLogger(CamelRoutesCollector.class); + + private final RegistryRoutesLoader registryRoutesLoader; + private final XmlRoutesLoader xmlRoutesLoader; + + public CamelRoutesCollector(RegistryRoutesLoader registryRoutesLoader, XmlRoutesLoader xmlRoutesLoader) { + this.registryRoutesLoader = registryRoutesLoader; + this.xmlRoutesLoader = xmlRoutesLoader; + } + + public RegistryRoutesLoader getRegistryRoutesLoader() { + return registryRoutesLoader; + } + + public XmlRoutesLoader getXmlRoutesLoader() { + return xmlRoutesLoader; + } + + @Override + public List<RoutesBuilder> collectRoutesFromRegistry( + CamelContext camelContext, + String excludePattern, + String includePattern) { + + return registryRoutesLoader.collectRoutesFromRegistry(camelContext, excludePattern, includePattern); + } + + @Override + public List<RoutesDefinition> collectXmlRoutesFromDirectory(CamelContext camelContext, String directory) { + List<RoutesDefinition> answer = new ArrayList<>(); + PackageScanResourceResolver resolver = camelContext.adapt(ExtendedCamelContext.class).getPackageScanResourceResolver(); + + for (String part : directory.split(",")) { + LOGGER.info("Loading additional Camel XML routes from: {}", part); + try { + for (InputStream is : resolver.findResources(part)) { + answer.add(xmlRoutesLoader.loadRoutesDefinition(camelContext, is)); + } + } catch (FileNotFoundException e) { + LOGGER.debug("No XML routes found in {}. Skipping XML routes detection.", part); + } catch (Exception e) { + throw RuntimeCamelException.wrapRuntimeException(e); + } + } + + return answer; + } + + @Override + public List<RestsDefinition> collectXmlRestsFromDirectory(CamelContext camelContext, String directory) { + List<RestsDefinition> answer = new ArrayList<>(); + PackageScanResourceResolver resolver = camelContext.adapt(ExtendedCamelContext.class).getPackageScanResourceResolver(); + + for (String part : directory.split(",")) { + LOGGER.info("Loading additional Camel XML rests from: {}", part); + try { + for (InputStream is : resolver.findResources(part)) { + answer.add(xmlRoutesLoader.loadRestsDefinition(camelContext, is)); + } + } catch (FileNotFoundException e) { + LOGGER.debug("No XML rests found in {}. Skipping XML rests detection.", part); + } catch (Exception e) { + throw RuntimeCamelException.wrapRuntimeException(e); + } + } + + return answer; + } +} diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java similarity index 95% copy from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java copy to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java index 3b2e4de..b470294 100644 --- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java +++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java @@ -22,7 +22,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.model.RoutesDefinition; import org.apache.camel.model.rest.RestsDefinition; -public class DisabledXmlLoader implements XmlLoader { +public class DisabledXmlRoutesLoader implements XmlRoutesLoader { @Override public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception { diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java index 05f5aa4..182f252 100644 --- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java +++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java @@ -41,9 +41,9 @@ import org.apache.camel.support.CamelContextHelper; public class FastModel extends BaseModel { - private final XmlLoader xmlLoader; + private final XmlRoutesLoader xmlLoader; - public FastModel(CamelContext camelContext, XmlLoader xmlLoader) { + public FastModel(CamelContext camelContext, XmlRoutesLoader xmlLoader) { super(camelContext); this.xmlLoader = xmlLoader; } diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoader.java similarity index 70% copy from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java copy to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoader.java index 09ed32e..58f45dc 100644 --- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java +++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoader.java @@ -16,16 +16,11 @@ */ package org.apache.camel.quarkus.core; -import java.io.InputStream; +import java.util.List; import org.apache.camel.CamelContext; -import org.apache.camel.model.RoutesDefinition; -import org.apache.camel.model.rest.RestsDefinition; - -public interface XmlLoader { - - RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception; - - RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception; +import org.apache.camel.RoutesBuilder; +public interface RegistryRoutesLoader { + List<RoutesBuilder> collectRoutesFromRegistry(CamelContext camelContext, String excludePattern, String includePattern); } diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoaders.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoaders.java new file mode 100644 index 0000000..2167689 --- /dev/null +++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/RegistryRoutesLoaders.java @@ -0,0 +1,103 @@ +/* + * 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.quarkus.core; + +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import org.apache.camel.CamelContext; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.util.AntPathMatcher; +import org.apache.camel.util.ObjectHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class RegistryRoutesLoaders { + private RegistryRoutesLoaders() { + } + + public static final class Disabled implements RegistryRoutesLoader { + @Override + public List<RoutesBuilder> collectRoutesFromRegistry( + CamelContext camelContext, + String excludePattern, + String includePattern) { + + return Collections.emptyList(); + } + } + + public static final class Default implements RegistryRoutesLoader { + private static final Logger LOGGER = LoggerFactory.getLogger(Default.class); + + @Override + public List<RoutesBuilder> collectRoutesFromRegistry( + CamelContext camelContext, + String excludePattern, + String includePattern) { + + final List<RoutesBuilder> routes = new ArrayList<>(); + final AntPathMatcher matcher = new AntPathMatcher(); + + Set<RoutesBuilder> builders = camelContext.getRegistry().findByType(RoutesBuilder.class); + for (RoutesBuilder routesBuilder : builders) { + // filter out abstract classes + boolean abs = Modifier.isAbstract(routesBuilder.getClass().getModifiers()); + if (!abs) { + String name = routesBuilder.getClass().getName(); + // make name as path so we can use ant path matcher + name = name.replace('.', '/'); + + boolean match = !"false".equals(includePattern); + // exclude take precedence over include + if (match && ObjectHelper.isNotEmpty(excludePattern)) { + // there may be multiple separated by comma + String[] parts = excludePattern.split(","); + for (String part : parts) { + // must negate when excluding, and hence ! + match = !matcher.match(part, name); + LOGGER.trace("Java RoutesBuilder: {} exclude filter: {} -> {}", name, part, match); + if (!match) { + break; + } + } + } + if (match && ObjectHelper.isNotEmpty(includePattern)) { + // there may be multiple separated by comma + String[] parts = includePattern.split(","); + for (String part : parts) { + match = matcher.match(part, name); + LOGGER.trace("Java RoutesBuilder: {} include filter: {} -> {}", name, part, match); + if (match) { + break; + } + } + } + LOGGER.debug("Java RoutesBuilder: {} accepted by include/exclude filter: {}", name, match); + if (match) { + routes.add(routesBuilder); + } + } + } + + return routes; + } + } +} diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java similarity index 97% copy from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java copy to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java index 09ed32e..36a2c1d 100644 --- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java +++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java @@ -22,7 +22,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.model.RoutesDefinition; import org.apache.camel.model.rest.RestsDefinition; -public interface XmlLoader { +public interface XmlRoutesLoader { RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception; diff --git a/integration-tests/core-main-collector/pom.xml b/integration-tests/core-main-collector/pom.xml new file mode 100644 index 0000000..72746c0 --- /dev/null +++ b/integration-tests/core-main-collector/pom.xml @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + 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. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-integration-tests</artifactId> + <version>1.1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>camel-quarkus-integration-test-core-main-collector</artifactId> + <name>Camel Quarkus :: Integration Tests :: Core Main Collector :: Tests</name> + <description>The camel integration tests</description> + + <dependencies> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-integration-test-support-core-main-collector-ext</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-direct</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-log</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-timer</artifactId> + </dependency> + + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-jsonb</artifactId> + </dependency> + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-resteasy-jsonb</artifactId> + </dependency> + + <!-- test dependencies --> + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-junit5</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.rest-assured</groupId> + <artifactId>rest-assured</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.assertj</groupId> + <artifactId>assertj-core</artifactId> + <scope>test</scope> + </dependency> + + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>build</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + +</project> diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java b/integration-tests/core-main-collector/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java similarity index 54% copy from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java copy to integration-tests/core-main-collector/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java index 3b2e4de..9f57961 100644 --- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java +++ b/integration-tests/core-main-collector/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java @@ -16,22 +16,34 @@ */ package org.apache.camel.quarkus.core; -import java.io.InputStream; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.json.Json; +import javax.json.JsonObject; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; import org.apache.camel.CamelContext; -import org.apache.camel.model.RoutesDefinition; -import org.apache.camel.model.rest.RestsDefinition; +import org.apache.camel.spi.Registry; -public class DisabledXmlLoader implements XmlLoader { +@Path("/test") +@ApplicationScoped +public class CamelServlet { + @Inject + CamelMain main; + @Inject + Registry registry; + @Inject + CamelContext context; - @Override - public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception { - throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml"); + @Path("/main/describe") + @GET + @Produces(MediaType.APPLICATION_JSON) + public JsonObject describeMain() { + return Json.createObjectBuilder() + .add("routes-collector-type", main.getRoutesCollector().getClass().getName()) + .build(); } - - @Override - public RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception { - throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml"); - } - } diff --git a/integration-tests/core-main/src/main/resources/application.properties b/integration-tests/core-main-collector/src/main/resources/application.properties similarity index 75% copy from integration-tests/core-main/src/main/resources/application.properties copy to integration-tests/core-main-collector/src/main/resources/application.properties index 23a94b0..70c6501 100644 --- a/integration-tests/core-main/src/main/resources/application.properties +++ b/integration-tests/core-main-collector/src/main/resources/application.properties @@ -20,29 +20,7 @@ quarkus.log.file.enable = false # -# Quarkus :: Camel -# -quarkus.camel.main.routes-discovery.exclude-patterns = org/**/*Filtered - -# # Camel # camel.context.name=quarkus-camel-example -# -# Timer -# -camel.component.timer.basic-property-binding = true - -# -# Main -# -camel.main.auto-configuration-log-summary = false -camel.main.xml-routes = file:src/test/resources/my-routes.xml - - -# -# Other -# -the.message = default -%staging.the.message = test \ No newline at end of file diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java b/integration-tests/core-main-collector/src/test/java/org/apache/camel/quarkus/core/CamelTest.java similarity index 53% rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java rename to integration-tests/core-main-collector/src/test/java/org/apache/camel/quarkus/core/CamelTest.java index 3b2e4de..a301353 100644 --- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlLoader.java +++ b/integration-tests/core-main-collector/src/test/java/org/apache/camel/quarkus/core/CamelTest.java @@ -16,22 +16,29 @@ */ package org.apache.camel.quarkus.core; -import java.io.InputStream; +import javax.ws.rs.core.MediaType; -import org.apache.camel.CamelContext; -import org.apache.camel.model.RoutesDefinition; -import org.apache.camel.model.rest.RestsDefinition; +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import org.apache.camel.quarkus.core.runtime.support.SupportRoutesCollector; +import org.junit.jupiter.api.Test; -public class DisabledXmlLoader implements XmlLoader { +import static org.assertj.core.api.Assertions.assertThat; - @Override - public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception { - throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml"); - } +@QuarkusTest +public class CamelTest { + @Test + public void testMainInstanceWithCustomCollector() { + JsonPath p = RestAssured.given() + .accept(MediaType.APPLICATION_JSON) + .get("/test/main/describe") + .then() + .statusCode(200) + .extract() + .body() + .jsonPath(); - @Override - public RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception { - throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml"); + assertThat(p.getString("routes-collector-type")).isEqualTo(SupportRoutesCollector.class.getName()); } - } diff --git a/integration-tests/core-main/pom.xml b/integration-tests/core-main-xml/pom.xml similarity index 82% copy from integration-tests/core-main/pom.xml copy to integration-tests/core-main-xml/pom.xml index bb0a336..79ee762 100644 --- a/integration-tests/core-main/pom.xml +++ b/integration-tests/core-main-xml/pom.xml @@ -25,8 +25,8 @@ </parent> <modelVersion>4.0.0</modelVersion> - <artifactId>camel-quarkus-integration-test-core-main</artifactId> - <name>Camel Quarkus :: Integration Tests :: Core Main :: Tests</name> + <artifactId>camel-quarkus-integration-test-core-main-xml</artifactId> + <name>Camel Quarkus :: Integration Tests :: Core Main XML :: Tests</name> <description>The camel integration tests</description> <dependencies> @@ -36,14 +36,6 @@ </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-endpointdsl</artifactId> - </dependency> - <dependency> - <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-reactive-executor</artifactId> - </dependency> - <dependency> - <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-direct</artifactId> </dependency> <dependency> @@ -54,10 +46,6 @@ <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-timer</artifactId> </dependency> - <dependency> - <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-integration-test-support-core-main-ext</artifactId> - </dependency> <dependency> <groupId>io.quarkus</groupId> @@ -100,15 +88,6 @@ </execution> </executions> </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <systemPropertyVariables> - <quarkus.test.profile>staging</quarkus.test.profile> - </systemPropertyVariables> - </configuration> - </plugin> </plugins> </build> @@ -134,7 +113,6 @@ <configuration> <systemProperties> <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path> - <quarkus.test.native-image-profile>staging</quarkus.test.native-image-profile> </systemProperties> </configuration> </execution> diff --git a/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java b/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java new file mode 100644 index 0000000..bab7f56 --- /dev/null +++ b/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java @@ -0,0 +1,72 @@ +/* + * 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.quarkus.core; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.json.Json; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.apache.camel.CamelContext; +import org.apache.camel.spi.Registry; + +@Path("/test") +@ApplicationScoped +public class CamelServlet { + @Inject + CamelMain main; + @Inject + Registry registry; + @Inject + CamelContext context; + + @Path("/main/describe") + @GET + @Produces(MediaType.APPLICATION_JSON) + public JsonObject describeMain() { + JsonArrayBuilder listeners = Json.createArrayBuilder(); + main.getMainListeners().forEach(listener -> listeners.add(listener.getClass().getName())); + + JsonArrayBuilder routeBuilders = Json.createArrayBuilder(); + main.getRoutesBuilders().forEach(builder -> routeBuilders.add(builder.getClass().getName())); + + JsonArrayBuilder routes = Json.createArrayBuilder(); + main.getCamelContext().getRoutes().forEach(route -> routes.add(route.getId())); + + JsonObjectBuilder collector = Json.createObjectBuilder(); + collector.add("type", main.getRoutesCollector().getClass().getName()); + if (main.getRoutesCollector() instanceof CamelRoutesCollector) { + CamelRoutesCollector crc = (CamelRoutesCollector) main.getRoutesCollector(); + collector.add("type-registry", crc.getRegistryRoutesLoader().getClass().getName()); + collector.add("type-xml", crc.getXmlRoutesLoader().getClass().getName()); + } + + return Json.createObjectBuilder() + .add("routes-collector", collector) + .add("listeners", listeners) + .add("routeBuilders", routeBuilders) + .add("routes", routes) + .add("autoConfigurationLogSummary", main.getMainConfigurationProperties().isAutoConfigurationLogSummary()) + .build(); + } +} diff --git a/integration-tests/core-main/src/main/resources/application.properties b/integration-tests/core-main-xml/src/main/resources/application.properties similarity index 80% copy from integration-tests/core-main/src/main/resources/application.properties copy to integration-tests/core-main-xml/src/main/resources/application.properties index 23a94b0..80ead8d 100644 --- a/integration-tests/core-main/src/main/resources/application.properties +++ b/integration-tests/core-main-xml/src/main/resources/application.properties @@ -20,29 +20,11 @@ quarkus.log.file.enable = false # -# Quarkus :: Camel -# -quarkus.camel.main.routes-discovery.exclude-patterns = org/**/*Filtered - -# # Camel # camel.context.name=quarkus-camel-example # -# Timer -# -camel.component.timer.basic-property-binding = true - -# # Main # -camel.main.auto-configuration-log-summary = false camel.main.xml-routes = file:src/test/resources/my-routes.xml - - -# -# Other -# -the.message = default -%staging.the.message = test \ No newline at end of file diff --git a/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CamelTest.java b/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CamelTest.java new file mode 100644 index 0000000..3d60e95 --- /dev/null +++ b/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CamelTest.java @@ -0,0 +1,53 @@ +/* + * 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.quarkus.core; + +import javax.ws.rs.core.MediaType; + +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.RestAssured; +import io.restassured.path.json.JsonPath; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +@QuarkusTest +public class CamelTest { + /* + * This test is tagged with quarkus-platform-ignore as it needs to be + * ignored when running camel test from the quarkus-platform as the + * test relies on a local route file being loaded. + */ + @Test + @Tag("quarkus-platform-ignore") + public void testMainInstanceWithXmlRoutes() { + JsonPath p = RestAssured.given() + .accept(MediaType.APPLICATION_JSON) + .get("/test/main/describe") + .then() + .statusCode(200) + .extract() + .body() + .jsonPath(); + + assertThat(p.getList("routeBuilders", String.class)) + .isEmpty(); + assertThat(p.getList("routes", String.class)) + .contains("my-xml-route"); + } +} diff --git a/integration-tests/core-main/src/test/resources/my-routes.xml b/integration-tests/core-main-xml/src/test/resources/my-routes.xml similarity index 100% rename from integration-tests/core-main/src/test/resources/my-routes.xml rename to integration-tests/core-main-xml/src/test/resources/my-routes.xml diff --git a/integration-tests/core-main/pom.xml b/integration-tests/core-main/pom.xml index bb0a336..6c03c8d 100644 --- a/integration-tests/core-main/pom.xml +++ b/integration-tests/core-main/pom.xml @@ -32,10 +32,6 @@ <dependencies> <dependency> <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-core-xml</artifactId> - </dependency> - <dependency> - <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-endpointdsl</artifactId> </dependency> <dependency> diff --git a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java index 52bc7db..b1081a0 100644 --- a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java +++ b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java @@ -113,7 +113,16 @@ public class CamelServlet { JsonArrayBuilder routes = Json.createArrayBuilder(); main.getCamelContext().getRoutes().forEach(route -> routes.add(route.getId())); + JsonObjectBuilder collector = Json.createObjectBuilder(); + collector.add("type", main.getRoutesCollector().getClass().getName()); + if (main.getRoutesCollector() instanceof CamelRoutesCollector) { + CamelRoutesCollector crc = (CamelRoutesCollector) main.getRoutesCollector(); + collector.add("type-registry", crc.getRegistryRoutesLoader().getClass().getName()); + collector.add("type-xml", crc.getXmlRoutesLoader().getClass().getName()); + } + return Json.createObjectBuilder() + .add("routes-collector", collector) .add("listeners", listeners) .add("routeBuilders", routeBuilders) .add("routes", routes) diff --git a/integration-tests/core-main/src/main/resources/application.properties b/integration-tests/core-main/src/main/resources/application.properties index 23a94b0..1cae6b3 100644 --- a/integration-tests/core-main/src/main/resources/application.properties +++ b/integration-tests/core-main/src/main/resources/application.properties @@ -38,7 +38,6 @@ camel.component.timer.basic-property-binding = true # Main # camel.main.auto-configuration-log-summary = false -camel.main.xml-routes = file:src/test/resources/my-routes.xml # diff --git a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java index 0109b68..8248b1c 100644 --- a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java +++ b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java @@ -17,6 +17,7 @@ package org.apache.camel.quarkus.core; import java.net.HttpURLConnection; + import javax.ws.rs.core.MediaType; import io.quarkus.test.junit.QuarkusTest; @@ -26,7 +27,6 @@ import io.restassured.path.json.JsonPath; import io.restassured.response.Response; import org.apache.camel.quarkus.core.runtime.support.SupportListener; import org.apache.camel.reactive.vertx.VertXReactiveExecutor; -import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -61,29 +61,6 @@ public class CamelTest { .then().body(is("my-ctx-name")); } - /* - * This test is tagged with quarkus-platform-ignore as it needs to be - * ignored when running camel test from the quarkus-platform as the - * test relies on a local route file being loaded. - */ - @Test - @Tag("quarkus-platform-ignore") - public void testMainInstanceWithXmlRoutes() { - JsonPath p = RestAssured.given() - .accept(MediaType.APPLICATION_JSON) - .get("/test/main/describe") - .then() - .statusCode(200) - .extract() - .body() - .jsonPath(); - - assertThat(p.getList("routeBuilders", String.class)) - .contains(SupportListener.MyBuilder.class.getName()); - assertThat(p.getList("routes", String.class)) - .contains("my-xml-route"); - } - @Test public void testMainInstance() { JsonPath p = RestAssured.given() @@ -95,6 +72,10 @@ public class CamelTest { .body() .jsonPath(); + assertThat(p.getString("routes-collector.type")).isEqualTo(CamelRoutesCollector.class.getName()); + assertThat(p.getString("routes-collector.type-registry")).isEqualTo(RegistryRoutesLoaders.Default.class.getName()); + assertThat(p.getString("routes-collector.type-xml")).isEqualTo(DisabledXmlRoutesLoader.class.getName()); + assertThat(p.getList("listeners", String.class)) .containsOnly(CamelMainEventDispatcher.class.getName(), SupportListener.class.getName()); assertThat(p.getList("routeBuilders", String.class)) diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 5fc84e5..4cbf371 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -62,6 +62,11 @@ </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-integration-test-support-core-main-collector-ext</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-integration-test-support</artifactId> <version>${project.version}</version> </dependency> @@ -147,6 +152,8 @@ <module>support</module> <module>core</module> <module>core-main</module> + <module>core-main-xml</module> + <module>core-main-collector</module> <module>core-impl</module> <!-- extensions a..z; do not remove this comment, it is important when sorting via mvn process-resources -Pformat --> diff --git a/integration-tests/support/core-main-collector/deployment/pom.xml b/integration-tests/support/core-main-collector/deployment/pom.xml new file mode 100644 index 0000000..598e7e9 --- /dev/null +++ b/integration-tests/support/core-main-collector/deployment/pom.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + 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. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-integration-tests-support-core-main-collector-parent</artifactId> + <version>1.1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>camel-quarkus-integration-test-support-core-main-collector-ext-deployment</artifactId> + <name>Camel Quarkus :: Integration Tests :: Support :: Core Main Collector :: Extension :: Deployment</name> + <description>A test extension</description> + + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-bom-deployment</artifactId> + <version>${project.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-core-deployment</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-integration-test-support-core-main-collector-ext</artifactId> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <annotationProcessorPaths> + <path> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-extension-processor</artifactId> + <version>${quarkus.version}</version> + </path> + </annotationProcessorPaths> + </configuration> + </plugin> + </plugins> + </build> + +</project> diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java b/integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/Feature.java similarity index 64% rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java rename to integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/Feature.java index 09ed32e..82fa65c 100644 --- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlLoader.java +++ b/integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/Feature.java @@ -14,18 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.quarkus.core; +package org.apache.camel.quarkus.core.runtime.support.deployment; -import java.io.InputStream; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.builditem.FeatureBuildItem; -import org.apache.camel.CamelContext; -import org.apache.camel.model.RoutesDefinition; -import org.apache.camel.model.rest.RestsDefinition; - -public interface XmlLoader { - - RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception; - - RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception; +public class Feature { + private static final String FEATURE = "camel-main-collector-support"; + @BuildStep + FeatureBuildItem feature() { + return new FeatureBuildItem(FEATURE); + } } diff --git a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java b/integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/SupportBuildStep.java similarity index 51% rename from extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java rename to integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/SupportBuildStep.java index 67a329d..2558d38 100644 --- a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlLoader.java +++ b/integration-tests/support/core-main-collector/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/SupportBuildStep.java @@ -14,26 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.quarkus.component.xml; +package org.apache.camel.quarkus.core.runtime.support.deployment; -import java.io.InputStream; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.annotations.ExecutionTime; +import io.quarkus.deployment.annotations.Record; +import org.apache.camel.quarkus.core.deployment.CamelMainListenerBuildItem; +import org.apache.camel.quarkus.core.deployment.CamelRoutesCollectorBuildItem; +import org.apache.camel.quarkus.core.deployment.CamelTypeConverterLoaderBuildItem; +import org.apache.camel.quarkus.core.runtime.support.SupportRecorder; -import org.apache.camel.CamelContext; -import org.apache.camel.model.ModelHelper; -import org.apache.camel.model.RoutesDefinition; -import org.apache.camel.model.rest.RestsDefinition; -import org.apache.camel.quarkus.core.XmlLoader; - -public class DefaultXmlLoader implements XmlLoader { - - @Override - public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream is) throws Exception { - return ModelHelper.loadRoutesDefinition(context, is); +public class SupportBuildStep { + @Record(ExecutionTime.STATIC_INIT) + @BuildStep + CamelRoutesCollectorBuildItem listener(SupportRecorder recorder) { + return new CamelRoutesCollectorBuildItem(recorder.createSupportCollector()); } - - @Override - public RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception { - return ModelHelper.loadRestsDefinition(context, is); - } - } diff --git a/integration-tests/support/pom.xml b/integration-tests/support/core-main-collector/pom.xml similarity index 69% copy from integration-tests/support/pom.xml copy to integration-tests/support/core-main-collector/pom.xml index 0103cc6..7e09d4e 100644 --- a/integration-tests/support/pom.xml +++ b/integration-tests/support/core-main-collector/pom.xml @@ -18,28 +18,22 @@ --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-integration-tests</artifactId> <version>1.1.0-SNAPSHOT</version> + <artifactId>camel-quarkus-integration-tests-support-parent</artifactId> <relativePath>../pom.xml</relativePath> </parent> - <artifactId>camel-quarkus-integration-tests-support-parent</artifactId> + <artifactId>camel-quarkus-integration-tests-support-core-main-collector-parent</artifactId> <packaging>pom</packaging> - <name>Camel Quarkus :: Integration Tests :: Support :: Parent</name> - <description>Ancillary modules required by some integration tests. Hosted outside the integration-tests directory - so that we can keep a flat hierarchy in the integration-tests directory. - </description> + <name>Camel Quarkus :: Integration Tests :: Support :: Core Main Collector:: Parent</name> <modules> - <module>test-support</module> - <module>testcontainers-support</module> - <module>core</module> - <module>core-main</module> + <module>runtime</module> + <module>deployment</module> </modules> </project> diff --git a/integration-tests/support/core-main-collector/runtime/pom.xml b/integration-tests/support/core-main-collector/runtime/pom.xml new file mode 100644 index 0000000..cabd394 --- /dev/null +++ b/integration-tests/support/core-main-collector/runtime/pom.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + 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. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-integration-tests-support-core-main-collector-parent</artifactId> + <version>1.1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>camel-quarkus-integration-test-support-core-main-collector-ext</artifactId> + <name>Camel Quarkus :: Integration Tests :: Support :: Core Main Collector :: Extension :: Runtime</name> + <description>A test extension</description> + + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-bom</artifactId> + <version>${project.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-core</artifactId> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-bootstrap-maven-plugin</artifactId> + </plugin> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <annotationProcessorPaths> + <path> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-extension-processor</artifactId> + <version>${quarkus.version}</version> + </path> + </annotationProcessorPaths> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelXmlLoaderBuildItem.java b/integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java similarity index 60% rename from extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelXmlLoaderBuildItem.java rename to integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java index 06703ec..4122733 100644 --- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelXmlLoaderBuildItem.java +++ b/integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java @@ -14,24 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.quarkus.core.deployment; +package org.apache.camel.quarkus.core.runtime.support; -import io.quarkus.builder.item.SimpleBuildItem; import io.quarkus.runtime.RuntimeValue; -import org.apache.camel.quarkus.core.XmlLoader; -import org.apache.camel.spi.ModelJAXBContextFactory; +import io.quarkus.runtime.annotations.Recorder; +import org.apache.camel.main.RoutesCollector; +import org.apache.camel.quarkus.core.CamelRoutesCollector; -/** - * Holds the {@link ModelJAXBContextFactory} instance. - */ -public final class CamelXmlLoaderBuildItem extends SimpleBuildItem { - private final RuntimeValue<XmlLoader> value; - - public CamelXmlLoaderBuildItem(RuntimeValue<XmlLoader> value) { - this.value = value; - } - - public RuntimeValue<XmlLoader> getXmlLoader() { - return value; +@Recorder +public class SupportRecorder { + public RuntimeValue<RoutesCollector> createSupportCollector() { + return new RuntimeValue<>(new SupportRoutesCollector()); } } diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesCollector.java b/integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRoutesCollector.java similarity index 62% rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesCollector.java rename to integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRoutesCollector.java index 7cd582c..d3ef48e 100644 --- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesCollector.java +++ b/integration-tests/support/core-main-collector/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRoutesCollector.java @@ -14,24 +14,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.quarkus.core; +package org.apache.camel.quarkus.core.runtime.support; +import java.util.Collections; import java.util.List; import org.apache.camel.CamelContext; -import org.apache.camel.main.DefaultRoutesCollector; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.main.RoutesCollector; import org.apache.camel.model.RoutesDefinition; import org.apache.camel.model.rest.RestsDefinition; -public class DisabledXmlRoutesCollector extends DefaultRoutesCollector { +public class SupportRoutesCollector implements RoutesCollector { + @Override + public List<RoutesBuilder> collectRoutesFromRegistry( + CamelContext camelContext, + String excludePattern, + String includePattern) { + return Collections.emptyList(); + } @Override - public List<RoutesDefinition> collectXmlRoutesFromDirectory(CamelContext camelContext, String directory) { - throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml"); + public List<RoutesDefinition> collectXmlRoutesFromDirectory(CamelContext camelContext, String directory) throws Exception { + return Collections.emptyList(); } @Override - public List<RestsDefinition> collectXmlRestsFromDirectory(CamelContext camelContext, String directory) { - throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml"); + public List<RestsDefinition> collectXmlRestsFromDirectory(CamelContext camelContext, String directory) throws Exception { + return Collections.emptyList(); } } diff --git a/integration-tests/support/pom.xml b/integration-tests/support/pom.xml index 0103cc6..5d1576b 100644 --- a/integration-tests/support/pom.xml +++ b/integration-tests/support/pom.xml @@ -40,6 +40,7 @@ <module>testcontainers-support</module> <module>core</module> <module>core-main</module> + <module>core-main-collector</module> </modules> </project>