This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch camel-master in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit f548b81000ccbd2888c2dd1cdf47c9f96217fb3a Author: Guillaume Nodet <[email protected]> AuthorDate: Mon Mar 30 14:06:52 2020 +0200 camel 3.2-snapshot --- docs/modules/ROOT/pages/cdi.adoc | 2 +- .../src/main/java/org/acme/timer/TimerRoute.java | 2 +- .../src/main/java/org/acme/timer/TimerRoute.java | 2 +- .../src/main/resources/routes/my-routes.xml | 2 +- .../src/main/java/org/acme/timer/TimerRoute.java | 2 +- .../core/deployment/NativeImageProcessor.java | 34 +++- .../org/apache/camel/quarkus/core/BaseModel.java | 59 +----- .../org/apache/camel/quarkus/core/CamelMain.java | 8 +- .../camel/quarkus/core/CamelMainRecorder.java | 1 - .../apache/camel/quarkus/core/CamelRecorder.java | 2 +- .../quarkus/core/DisabledValidateReifier.java | 6 +- .../camel/quarkus/core/FastCamelContext.java | 225 ++++++++++++--------- .../org/apache/camel/quarkus/core/FastModel.java | 195 ------------------ .../camel/quarkus/core/FastTypeConverter.java | 5 +- .../component/xml/jaxb/XmlJaxbRecorder.java | 2 +- .../component/qute/QuteComponentConfigurer.java | 32 ++- .../component/qute/QuteEndpointConfigurer.java | 36 +++- .../org/apache/camel/component/qute/qute.json | 1 + 18 files changed, 245 insertions(+), 371 deletions(-) diff --git a/docs/modules/ROOT/pages/cdi.adoc b/docs/modules/ROOT/pages/cdi.adoc index e9f1420..f858973 100644 --- a/docs/modules/ROOT/pages/cdi.adoc +++ b/docs/modules/ROOT/pages/cdi.adoc @@ -15,7 +15,7 @@ import org.eclipse.microprofile.config.inject.ConfigProperty; @ApplicationScoped <1> public class TimerRoute extends RouteBuilder { - @ConfigProperty(name = "timer.period", defaultValue = "1s") <2> + @ConfigProperty(name = "timer.period", defaultValue = "1000") <2> String period; @Inject diff --git a/examples/timer-log-cdi/src/main/java/org/acme/timer/TimerRoute.java b/examples/timer-log-cdi/src/main/java/org/acme/timer/TimerRoute.java index 8052005..0e0056f 100644 --- a/examples/timer-log-cdi/src/main/java/org/acme/timer/TimerRoute.java +++ b/examples/timer-log-cdi/src/main/java/org/acme/timer/TimerRoute.java @@ -32,7 +32,7 @@ import org.eclipse.microprofile.config.inject.ConfigProperty; public class TimerRoute extends RouteBuilder { /** {@code timer.period} is defined in {@code src/main/resources/application.properties} */ - @ConfigProperty(name = "timer.period", defaultValue = "1s") + @ConfigProperty(name = "timer.period", defaultValue = "1000") String period; /** An injected bean */ diff --git a/examples/timer-log-spring/src/main/java/org/acme/timer/TimerRoute.java b/examples/timer-log-spring/src/main/java/org/acme/timer/TimerRoute.java index 21c07bd..a7cdd61 100644 --- a/examples/timer-log-spring/src/main/java/org/acme/timer/TimerRoute.java +++ b/examples/timer-log-spring/src/main/java/org/acme/timer/TimerRoute.java @@ -31,7 +31,7 @@ public class TimerRoute extends RouteBuilder { * {@code timer.period} is defined in {@code src/main/resources/application.properties} */ @Value("timer.period") - String period = "1s"; + String period = "1000"; /** * An injected bean diff --git a/examples/timer-log-xml/src/main/resources/routes/my-routes.xml b/examples/timer-log-xml/src/main/resources/routes/my-routes.xml index 42fd73f..ed63c39 100644 --- a/examples/timer-log-xml/src/main/resources/routes/my-routes.xml +++ b/examples/timer-log-xml/src/main/resources/routes/my-routes.xml @@ -24,7 +24,7 @@ http://camel.apache.org/schema/spring/camel-spring.xsd"> <route id="xml-route"> - <from uri="timer:from-xml?period=1s"/> + <from uri="timer:from-xml?period=1000"/> <log message="Hello XML!"/> </route> diff --git a/examples/timer-log/src/main/java/org/acme/timer/TimerRoute.java b/examples/timer-log/src/main/java/org/acme/timer/TimerRoute.java index 70b8bd7..0a3b0b9 100644 --- a/examples/timer-log/src/main/java/org/acme/timer/TimerRoute.java +++ b/examples/timer-log/src/main/java/org/acme/timer/TimerRoute.java @@ -22,7 +22,7 @@ public class TimerRoute extends RouteBuilder { @Override public void configure() throws Exception { - from("timer:foo?period=1s") + from("timer:foo?period=1000") .log("Hello World"); } } diff --git a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/NativeImageProcessor.java b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/NativeImageProcessor.java index 0daef50..c055309 100644 --- a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/NativeImageProcessor.java +++ b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/NativeImageProcessor.java @@ -33,6 +33,7 @@ import io.quarkus.deployment.builditem.CombinedIndexBuildItem; import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem; import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; import io.quarkus.deployment.builditem.nativeimage.ReflectiveMethodBuildItem; +import io.quarkus.deployment.builditem.nativeimage.RuntimeReinitializedClassBuildItem; import org.apache.camel.CamelContext; import org.apache.camel.Component; import org.apache.camel.Consumer; @@ -85,7 +86,7 @@ public class NativeImageProcessor { PropertiesComponent.class, DataFormat.class); - @BuildStep + // @BuildStep void reflectiveItems( CombinedIndexBuildItem combinedIndex, BuildProducer<ReflectiveClassBuildItem> reflectiveClass, @@ -138,7 +139,7 @@ public class NativeImageProcessor { } - @BuildStep + // @BuildStep void camelServices( List<CamelServiceBuildItem> camelServices, BuildProducer<ReflectiveClassBuildItem> reflectiveClass) { @@ -292,16 +293,16 @@ public class NativeImageProcessor { // camelRoutesBuilders.forEach(camelRoutesBuilderClassBuildItem -> { reflectiveClass.produce( - new ReflectiveClassBuildItem(true, true, camelRoutesBuilderClassBuildItem.getDotName().toString())); + new ReflectiveClassBuildItem(false, false, camelRoutesBuilderClassBuildItem.getDotName().toString())); }); - reflectiveClass.produce(new ReflectiveClassBuildItem( - true, - false, - org.apache.camel.main.DefaultConfigurationProperties.class, - org.apache.camel.main.MainConfigurationProperties.class, - org.apache.camel.main.HystrixConfigurationProperties.class, - org.apache.camel.main.RestConfigurationProperties.class)); + // reflectiveClass.produce(new ReflectiveClassBuildItem( + // true, + // false, + // org.apache.camel.main.DefaultConfigurationProperties.class, + // org.apache.camel.main.MainConfigurationProperties.class, + // org.apache.camel.main.HystrixConfigurationProperties.class, + // org.apache.camel.main.RestConfigurationProperties.class)); // TODO: The classes below are needed to fix https://github.com/apache/camel-quarkus/issues/1005 // but we need to investigate why it does not fail with Java 1.8 @@ -314,4 +315,17 @@ public class NativeImageProcessor { org.apache.camel.spi.RestConfiguration.class)); } } + + @BuildStep + void process(BuildProducer<RuntimeReinitializedClassBuildItem> reinitialized) { + for (String s : Arrays.asList( + "sun.security.jca.JCAUtil", + "sun.security.jca.JCAUtil$CachedSecureRandomHolder", + "sun.security.provider.SecureRandom$SeederHolder", + "sun.security.provider.SeedGenerator", + "java.security.SecureRandom", + "java.net.DefaultDatagramSocketImplFactory")) { + reinitialized.produce(new RuntimeReinitializedClassBuildItem(s)); + } + } } diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BaseModel.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BaseModel.java index 0a11942..2ccfc61 100644 --- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BaseModel.java +++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BaseModel.java @@ -16,28 +16,13 @@ */ package org.apache.camel.quarkus.core; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import org.apache.camel.CamelContext; import org.apache.camel.ExtendedCamelContext; -import org.apache.camel.FailedToStartRouteException; -import org.apache.camel.model.DataFormatDefinition; -import org.apache.camel.model.HystrixConfigurationDefinition; -import org.apache.camel.model.Model; -import org.apache.camel.model.ProcessorDefinition; -import org.apache.camel.model.ProcessorDefinitionHelper; -import org.apache.camel.model.Resilience4jConfigurationDefinition; -import org.apache.camel.model.RouteDefinition; -import org.apache.camel.model.RouteDefinitionHelper; -import org.apache.camel.model.RouteFilters; +import org.apache.camel.model.*; import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition; import org.apache.camel.model.rest.RestDefinition; import org.apache.camel.model.transformer.TransformerDefinition; @@ -80,7 +65,7 @@ public abstract class BaseModel implements Model { removeRouteDefinitions(list); this.routeDefinitions.addAll(list); if (shouldStartRoutes()) { - startRouteDefinitions(list); + getCamelContext().adapt(ModelCamelContext.class).startRouteDefinitions(list); } } @@ -256,7 +241,7 @@ public abstract class BaseModel implements Model { } @Override - public <T extends ProcessorDefinition> T getProcessorDefinition(String id, Class<T> type) { + public <T extends ProcessorDefinition<T>> T getProcessorDefinition(String id, Class<T> type) { ProcessorDefinition answer = getProcessorDefinition(id); if (answer != null) { return type.cast(answer); @@ -295,11 +280,6 @@ public abstract class BaseModel implements Model { } @Override - public void startRouteDefinitions() throws Exception { - startRouteDefinitions(routeDefinitions); - } - - @Override public void setRouteFilterPattern(String include, String exclude) { setRouteFilter(RouteFilters.filterByPattern(include, exclude)); } @@ -314,37 +294,6 @@ public abstract class BaseModel implements Model { this.routeFilter = routeFilter; } - protected void startRouteDefinitions(Collection<RouteDefinition> list) throws Exception { - if (list != null) { - for (RouteDefinition route : list) { - startRoute(route); - } - } - } - - public void startRoute(RouteDefinition routeDefinition) throws Exception { - prepare(routeDefinition); - start(routeDefinition); - } - - protected void prepare(RouteDefinition routeDefinition) throws Exception { - // assign ids to the routes and validate that the id's is all unique - RouteDefinitionHelper.forceAssignIds(camelContext, routeDefinitions); - String duplicate = RouteDefinitionHelper.validateUniqueIds(routeDefinition, routeDefinitions); - if (duplicate != null) { - throw new FailedToStartRouteException(routeDefinition.getId(), - "duplicate id detected: " + duplicate + ". Please correct ids to be unique among all your routes."); - } - - // must ensure route is prepared, before we can start it - if (!routeDefinition.isPrepared()) { - RouteDefinitionHelper.prepareRoute(camelContext, routeDefinition); - routeDefinition.markPrepared(); - } - } - - protected abstract void start(RouteDefinition routeDefinition) throws Exception; - /** * Should we start newly added routes? */ diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMain.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMain.java index a83862c..34cfa37 100644 --- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMain.java +++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMain.java @@ -41,12 +41,18 @@ public class CamelMain extends BaseMainSupport implements CamelContextAware { } @Override + protected void doInit() throws Exception { + super.doInit(); + postProcessCamelContext(getCamelContext()); + getCamelContext().init(); + } + + @Override protected void doStart() throws Exception { for (MainListener listener : listeners) { listener.beforeStart(this); } - postProcessCamelContext(getCamelContext()); getCamelContext().start(); for (MainListener listener : listeners) { diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java index ec0d238..8542ee6 100644 --- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java +++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java @@ -93,7 +93,6 @@ public class CamelMainRecorder { }); try { - main.getValue().init(); main.getValue().start(); } catch (Exception e) { throw new RuntimeException(e); diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java index 56c37e5..95770b0 100644 --- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java +++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java @@ -80,7 +80,7 @@ public class CamelRecorder { context.setTypeConverterRegistry(typeConverterRegistry.getValue()); context.setLoadTypeConverters(false); context.setModelJAXBContextFactory(contextFactory.getValue()); - context.init(); + context.build(); // register to the container beanContainer.instance(CamelProducers.class).setContext(context); diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java index 911bfe7..a9b8144 100644 --- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java +++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java @@ -17,15 +17,15 @@ package org.apache.camel.quarkus.core; import org.apache.camel.Processor; +import org.apache.camel.Route; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.ValidateDefinition; import org.apache.camel.reifier.ProcessorReifier; -import org.apache.camel.spi.RouteContext; public class DisabledValidateReifier extends ProcessorReifier<ValidateDefinition> { - public DisabledValidateReifier(RouteContext routeContext, ProcessorDefinition<?> definition) { - super(routeContext, (ValidateDefinition) definition); + public DisabledValidateReifier(Route route, ProcessorDefinition<?> definition) { + super(route, (ValidateDefinition) definition); } @Override diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java index f0d0493..768a48f 100644 --- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java +++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java @@ -24,105 +24,33 @@ import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.function.Function; -import org.apache.camel.AsyncProcessor; -import org.apache.camel.CatalogCamelContext; -import org.apache.camel.Component; -import org.apache.camel.Endpoint; -import org.apache.camel.Processor; -import org.apache.camel.TypeConverter; +import org.apache.camel.*; +import org.apache.camel.builder.AdviceWithRouteBuilder; import org.apache.camel.catalog.RuntimeCamelCatalog; import org.apache.camel.catalog.impl.DefaultRuntimeCamelCatalog; import org.apache.camel.component.microprofile.config.CamelMicroProfilePropertiesSource; import org.apache.camel.health.HealthCheckRegistry; import org.apache.camel.impl.DefaultExecutorServiceManager; -import org.apache.camel.impl.engine.AbstractCamelContext; -import org.apache.camel.impl.engine.BeanProcessorFactoryResolver; -import org.apache.camel.impl.engine.BeanProxyFactoryResolver; -import org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager; -import org.apache.camel.impl.engine.DefaultBeanIntrospection; -import org.apache.camel.impl.engine.DefaultCamelBeanPostProcessor; -import org.apache.camel.impl.engine.DefaultCamelContextNameStrategy; -import org.apache.camel.impl.engine.DefaultClassResolver; -import org.apache.camel.impl.engine.DefaultComponentResolver; -import org.apache.camel.impl.engine.DefaultConfigurerResolver; -import org.apache.camel.impl.engine.DefaultDataFormatResolver; -import org.apache.camel.impl.engine.DefaultEndpointRegistry; -import org.apache.camel.impl.engine.DefaultInflightRepository; -import org.apache.camel.impl.engine.DefaultInjector; -import org.apache.camel.impl.engine.DefaultLanguageResolver; -import org.apache.camel.impl.engine.DefaultMessageHistoryFactory; -import org.apache.camel.impl.engine.DefaultNodeIdFactory; -import org.apache.camel.impl.engine.DefaultPackageScanClassResolver; -import org.apache.camel.impl.engine.DefaultPackageScanResourceResolver; -import org.apache.camel.impl.engine.DefaultProcessorFactory; -import org.apache.camel.impl.engine.DefaultReactiveExecutor; -import org.apache.camel.impl.engine.DefaultRouteController; -import org.apache.camel.impl.engine.DefaultStreamCachingStrategy; -import org.apache.camel.impl.engine.DefaultTracer; -import org.apache.camel.impl.engine.DefaultTransformerRegistry; -import org.apache.camel.impl.engine.DefaultUnitOfWorkFactory; -import org.apache.camel.impl.engine.DefaultValidatorRegistry; -import org.apache.camel.impl.engine.EndpointKey; -import org.apache.camel.impl.engine.HeadersMapFactoryResolver; -import org.apache.camel.impl.engine.RestRegistryFactoryResolver; +import org.apache.camel.impl.engine.*; import org.apache.camel.impl.health.DefaultHealthCheckRegistry; import org.apache.camel.impl.transformer.TransformerKey; import org.apache.camel.impl.validator.ValidatorKey; -import org.apache.camel.model.DataFormatDefinition; -import org.apache.camel.model.HystrixConfigurationDefinition; -import org.apache.camel.model.Model; -import org.apache.camel.model.ModelCamelContext; -import org.apache.camel.model.ProcessorDefinition; -import org.apache.camel.model.Resilience4jConfigurationDefinition; -import org.apache.camel.model.RouteDefinition; +import org.apache.camel.model.*; import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition; +import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.model.rest.RestDefinition; import org.apache.camel.model.transformer.TransformerDefinition; import org.apache.camel.model.validator.ValidatorDefinition; import org.apache.camel.processor.MulticastProcessor; -import org.apache.camel.spi.AsyncProcessorAwaitManager; -import org.apache.camel.spi.BeanIntrospection; -import org.apache.camel.spi.BeanProcessorFactory; -import org.apache.camel.spi.BeanProxyFactory; -import org.apache.camel.spi.CamelBeanPostProcessor; -import org.apache.camel.spi.CamelContextNameStrategy; -import org.apache.camel.spi.ClassResolver; -import org.apache.camel.spi.ComponentResolver; -import org.apache.camel.spi.ConfigurerResolver; -import org.apache.camel.spi.DataFormat; -import org.apache.camel.spi.DataFormatResolver; -import org.apache.camel.spi.EndpointRegistry; -import org.apache.camel.spi.ExecutorServiceManager; -import org.apache.camel.spi.FactoryFinderResolver; -import org.apache.camel.spi.HeadersMapFactory; -import org.apache.camel.spi.InflightRepository; -import org.apache.camel.spi.Injector; -import org.apache.camel.spi.Language; -import org.apache.camel.spi.LanguageResolver; -import org.apache.camel.spi.ManagementNameStrategy; -import org.apache.camel.spi.MessageHistoryFactory; -import org.apache.camel.spi.ModelJAXBContextFactory; -import org.apache.camel.spi.ModelToXMLDumper; -import org.apache.camel.spi.NodeIdFactory; -import org.apache.camel.spi.PackageScanClassResolver; -import org.apache.camel.spi.PackageScanResourceResolver; -import org.apache.camel.spi.ProcessorFactory; -import org.apache.camel.spi.PropertiesComponent; -import org.apache.camel.spi.ReactiveExecutor; -import org.apache.camel.spi.Registry; -import org.apache.camel.spi.RestRegistryFactory; -import org.apache.camel.spi.RouteController; -import org.apache.camel.spi.ShutdownStrategy; -import org.apache.camel.spi.StreamCachingStrategy; -import org.apache.camel.spi.Tracer; -import org.apache.camel.spi.TransformerRegistry; -import org.apache.camel.spi.TypeConverterRegistry; -import org.apache.camel.spi.UnitOfWorkFactory; -import org.apache.camel.spi.UuidGenerator; -import org.apache.camel.spi.ValidatorRegistry; -import org.apache.camel.spi.XMLRoutesDefinitionLoader; +import org.apache.camel.reifier.RouteReifier; +import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier; +import org.apache.camel.reifier.language.ExpressionReifier; +import org.apache.camel.reifier.transformer.TransformerReifier; +import org.apache.camel.reifier.validator.ValidatorReifier; +import org.apache.camel.spi.*; import org.apache.camel.support.CamelContextHelper; import org.apache.camel.util.IOHelper; +import org.apache.camel.util.ObjectHelper; public class FastCamelContext extends AbstractCamelContext implements CatalogCamelContext, ModelCamelContext { private final Model model; @@ -285,17 +213,25 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam @Override protected HeadersMapFactory createHeadersMapFactory() { - return new HeadersMapFactoryResolver().resolve(this); + return new BaseServiceResolver<>(HeadersMapFactory.FACTORY, HeadersMapFactory.class) + .resolve(getCamelContextReference()) + .orElseGet(DefaultHeadersMapFactory::new); } @Override protected BeanProxyFactory createBeanProxyFactory() { - return new BeanProxyFactoryResolver().resolve(this); + return new BaseServiceResolver<>(BeanProxyFactory.FACTORY, BeanProxyFactory.class) + .resolve(getCamelContextReference()) + .orElseThrow(() -> new IllegalArgumentException("Cannot find BeanProxyFactory on classpath. " + + "Add camel-bean to classpath.")); } @Override protected BeanProcessorFactory createBeanProcessorFactory() { - return new BeanProcessorFactoryResolver().resolve(this); + return new BaseServiceResolver<>(BeanProcessorFactory.FACTORY, BeanProcessorFactory.class) + .resolve(getCamelContextReference()) + .orElseThrow(() -> new IllegalArgumentException("Cannot find BeanProcessorFactory on classpath. " + + "Add camel-bean to classpath.")); } @Override @@ -357,7 +293,10 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam @Override protected RestRegistryFactory createRestRegistryFactory() { - return new RestRegistryFactoryResolver().resolve(this); + return new BaseServiceResolver<>(RestRegistryFactory.FACTORY, RestRegistryFactory.class) + .resolve(getCamelContextReference()) + .orElseThrow(() -> new IllegalArgumentException("Cannot find RestRegistryFactory on classpath. " + + "Add camel-rest to classpath.")); } @Override @@ -388,8 +327,9 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam @Override public AsyncProcessor createMulticast(Collection<Processor> processors, ExecutorService executor, boolean shutdownExecutorService) { - return new MulticastProcessor(this, processors, null, true, executor, shutdownExecutorService, - false, false, 0L, null, false, false); + return new MulticastProcessor(getCamelContextReference(), null, processors, null, + true, executor, shutdownExecutorService, false, false, + 0, null, false, false); } @Override @@ -398,6 +338,24 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam } @Override + protected HealthCheckRegistry createHealthCheckRegistry() { + return new DefaultHealthCheckRegistry(this); + } + + @Override + protected ComponentNameResolver createComponentNameResolver() { + return new DefaultComponentNameResolver(); + } + + @Override + protected RestBindingJaxbDataFormatFactory createRestBindingJaxbDataFormatFactory() { + return new BaseServiceResolver<>(RestBindingJaxbDataFormatFactory.FACTORY, RestBindingJaxbDataFormatFactory.class) + .resolve(getCamelContextReference()) + .orElseThrow(() -> new IllegalArgumentException("Cannot find RestBindingJaxbDataFormatFactory on classpath. " + + "Add camel-jaxb to classpath.")); + } + + @Override public void setTypeConverterRegistry(TypeConverterRegistry typeConverterRegistry) { super.setTypeConverterRegistry(typeConverterRegistry); @@ -506,13 +464,22 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam return null; } + @Override + public Processor createErrorHandler(Route route, Processor processor) throws Exception { + return ErrorHandlerReifier.reifier(route, route.getErrorHandlerFactory()) + .createErrorHandler(processor); + } + // // ModelCamelContext // @Override public void startRouteDefinitions() throws Exception { - model.startRouteDefinitions(); + List<RouteDefinition> routeDefinitions = model.getRouteDefinitions(); + if (routeDefinitions != null) { + startRouteDefinitions(routeDefinitions); + } } @Override @@ -576,7 +543,7 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam } @Override - public <T extends ProcessorDefinition> T getProcessorDefinition(String id, Class<T> type) { + public <T extends ProcessorDefinition<T>> T getProcessorDefinition(String id, Class<T> type) { return model.getProcessorDefinition(id, type); } @@ -674,4 +641,78 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam public Function<RouteDefinition, Boolean> getRouteFilter() { return model.getRouteFilter(); } + + @Override + public void startRouteDefinitions(List<RouteDefinition> routeDefinitions) throws Exception { + // indicate we are staring the route using this thread so + // we are able to query this if needed + boolean alreadyStartingRoutes = isStartingRoutes(); + if (!alreadyStartingRoutes) { + setStartingRoutes(true); + } + try { + RouteDefinitionHelper.forceAssignIds(getCamelContextReference(), routeDefinitions); + for (RouteDefinition routeDefinition : routeDefinitions) { + // assign ids to the routes and validate that the id's is all unique + String duplicate = RouteDefinitionHelper.validateUniqueIds(routeDefinition, routeDefinitions); + if (duplicate != null) { + throw new FailedToStartRouteException(routeDefinition.getId(), + "duplicate id detected: " + duplicate + ". Please correct ids to be unique among all your routes."); + } + + // must ensure route is prepared, before we can start it + if (!routeDefinition.isPrepared()) { + RouteDefinitionHelper.prepareRoute(getCamelContextReference(), routeDefinition); + routeDefinition.markPrepared(); + } + + Route route = new RouteReifier(getCamelContextReference(), routeDefinition).createRoute(); + RouteService routeService = new RouteService(route); + startRouteService(routeService, true); + } + } finally { + if (!alreadyStartingRoutes) { + setStartingRoutes(false); + } + } + } + + @Override + public Expression createExpression(ExpressionDefinition definition) { + return ExpressionReifier.reifier(this, definition).createExpression(); + } + + @Override + public Predicate createPredicate(ExpressionDefinition definition) { + return ExpressionReifier.reifier(this, definition).createPredicate(); + } + + @Override + public RouteDefinition adviceWith(RouteDefinition definition, AdviceWithRouteBuilder builder) throws Exception { + return RouteReifier.adviceWith(definition, this, builder); + } + + @Override + public void registerValidator(ValidatorDefinition def) { + model.getValidators().add(def); + Validator validator = ValidatorReifier.reifier(this, def).createValidator(); + getValidatorRegistry().put(createValidatorKey(def), validator); + } + + private static ValueHolder<String> createValidatorKey(ValidatorDefinition def) { + return new ValidatorKey(new DataType(def.getType())); + } + + @Override + public void registerTransformer(TransformerDefinition def) { + model.getTransformers().add(def); + Transformer transformer = TransformerReifier.reifier(this, def).createTransformer(); + getTransformerRegistry().put(createTransformerKey(def), transformer); + } + + private static ValueHolder<String> createTransformerKey(TransformerDefinition def) { + return ObjectHelper.isNotEmpty(def.getScheme()) ? new TransformerKey(def.getScheme()) + : new TransformerKey(new DataType(def.getFromType()), new DataType(def.getToType())); + } + } diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java index 847cfcc..fd299a8 100644 --- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java +++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java @@ -16,206 +16,11 @@ */ package org.apache.camel.quarkus.core; -import java.util.ArrayList; -import java.util.List; - import org.apache.camel.CamelContext; -import org.apache.camel.ErrorHandlerFactory; -import org.apache.camel.ExtendedCamelContext; -import org.apache.camel.NamedNode; -import org.apache.camel.Navigate; -import org.apache.camel.Processor; -import org.apache.camel.Route; -import org.apache.camel.Service; -import org.apache.camel.impl.engine.AbstractCamelContext; -import org.apache.camel.impl.engine.BaseRouteService; -import org.apache.camel.impl.engine.DefaultRouteContext; -import org.apache.camel.model.OnCompletionDefinition; -import org.apache.camel.model.OnExceptionDefinition; -import org.apache.camel.model.ProcessorDefinition; -import org.apache.camel.model.RouteDefinition; -import org.apache.camel.model.RouteDefinitionHelper; -import org.apache.camel.processor.channel.DefaultChannel; -import org.apache.camel.reifier.RouteReifier; -import org.apache.camel.support.CamelContextHelper; public class FastModel extends BaseModel { public FastModel(CamelContext camelContext) { super(camelContext); } - @Override - protected void start(RouteDefinition routeDefinition) throws Exception { - // indicate we are staring the route using this thread so - // we are able to query this if needed - CamelContext camelContext = getCamelContext(); - AbstractCamelContext mcc = camelContext.adapt(AbstractCamelContext.class); - mcc.setStartingRoutes(true); - try { - String id = routeDefinition.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory()); - FastRouteContext routeContext = new FastRouteContext(camelContext, routeDefinition, id); - Route route = new RouteReifier(routeContext, routeDefinition).createRoute(); - FastRouteService routeService = createRouteService(route); - mcc.startRouteService(routeService, true); - } finally { - // we are done staring routes - mcc.setStartingRoutes(false); - } - } - - private FastRouteService createRouteService(Route route) { - Integer startupOrder; - String description; - boolean autoStartup; - boolean contextScopedErrorHandler; - List<Service> routeScopedServices; - - RouteDefinition definition = (RouteDefinition) route.getRouteContext().getRoute(); - startupOrder = definition.getStartupOrder(); - description = RouteDefinitionHelper.getRouteMessage(definition.toString()); - - if (!route.getCamelContext().isAutoStartup()) { - autoStartup = false; - } else if (definition.getAutoStartup() == null) { - // should auto startup by default - autoStartup = true; - } else { - Boolean isAutoStartup = CamelContextHelper.parseBoolean(route.getCamelContext(), definition.getAutoStartup()); - autoStartup = isAutoStartup != null && isAutoStartup; - } - - if (!definition.isContextScopedErrorHandler()) { - contextScopedErrorHandler = false; - } else if (definition.getErrorHandlerRef() != null) { - // if error handler ref is configured it may refer to a context scoped, so we need to check this first - // the XML DSL will configure error handlers using refs, so we need this additional test - ErrorHandlerFactory routeScoped = route.getRouteContext().getErrorHandlerFactory(); - ErrorHandlerFactory contextScoped = route.getCamelContext().adapt(ExtendedCamelContext.class) - .getErrorHandlerFactory(); - contextScopedErrorHandler = contextScoped != null && routeScoped == contextScoped; - } else { - contextScopedErrorHandler = true; - } - - List<Service> services = new ArrayList<>(); - for (ProcessorDefinition<?> output : definition.getOutputs()) { - if (output instanceof OnExceptionDefinition) { - OnExceptionDefinition onExceptionDefinition = (OnExceptionDefinition) output; - if (onExceptionDefinition.isRouteScoped()) { - Processor errorHandler = route.getRouteContext().getOnException(onExceptionDefinition.getId()); - if (errorHandler instanceof Service) { - services.add((Service) errorHandler); - } - } - } else if (output instanceof OnCompletionDefinition) { - OnCompletionDefinition onCompletionDefinition = (OnCompletionDefinition) output; - if (onCompletionDefinition.isRouteScoped()) { - Processor onCompletionProcessor = route.getRouteContext().getOnCompletion(onCompletionDefinition.getId()); - if (onCompletionProcessor instanceof Service) { - services.add((Service) onCompletionProcessor); - } - } - } - } - routeScopedServices = services; - - FastRouteService routeService = new FastRouteService(route); - routeService.setStartupOrder(startupOrder); - routeService.setDescription(description); - routeService.setAutoStartup(autoStartup); - routeService.setContextScopedErrorHandler(contextScopedErrorHandler); - routeService.setRouteScopedServices(routeScopedServices); - return routeService; - } - - static class FastRouteContext extends DefaultRouteContext { - - private NamedNode route; - - public FastRouteContext(CamelContext camelContext, NamedNode route, String routeId) { - super(camelContext, null, routeId); - this.route = route; - } - - @Override - public NamedNode getRoute() { - return route; - } - - @SuppressWarnings("unchecked") - private void clearModel(Processor nav) { - if (nav instanceof DefaultChannel) { - DefaultChannel channel = (DefaultChannel) nav; - channel.setDefinition(null); - } - if (nav instanceof Navigate) { - List<Processor> children = ((Navigate<Processor>) nav).next(); - if (children != null) { - for (Processor p : children) { - clearModel(p); - } - } - } - } - - } - - static class FastRouteService extends BaseRouteService { - - private Integer startupOrder; - private String description; - private boolean autoStartup; - private boolean contextScopedErrorHandler; - private List<Service> routeScopedServices; - - public FastRouteService(Route route) { - super(route); - } - - public void setStartupOrder(Integer startupOrder) { - this.startupOrder = startupOrder; - } - - public void setDescription(String description) { - this.description = description; - } - - public void setAutoStartup(boolean autoStartup) { - this.autoStartup = autoStartup; - } - - public void setContextScopedErrorHandler(boolean contextScopedErrorHandler) { - this.contextScopedErrorHandler = contextScopedErrorHandler; - } - - public void setRouteScopedServices(List<Service> routeScopedServices) { - this.routeScopedServices = routeScopedServices; - } - - @Override - public Integer getStartupOrder() { - return startupOrder; - } - - @Override - protected String getRouteDescription() { - return description; - } - - @Override - public boolean isAutoStartup() { - return autoStartup; - } - - @Override - public boolean isContextScopedErrorHandler() { - return contextScopedErrorHandler; - } - - @Override - protected void doGetRouteScopedServices(List<Service> services) { - services.addAll(routeScopedServices); - } - } - } diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java index 178250f..83ec56e 100644 --- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java +++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java @@ -29,7 +29,10 @@ public class FastTypeConverter extends DefaultTypeConverter { } @Override - protected void doStart() throws Exception { + protected void doInit() throws Exception { + if (this.injector == null && this.camelContext != null) { + this.injector = this.camelContext.getInjector(); + } for (TypeConverterLoader loader : getCamelContext().getRegistry().findByType(TypeConverterLoader.class)) { LOG.debug("TypeConverterLoader: {} loading converters", loader); loader.load(this); diff --git a/extensions-core/xml-jaxb/runtime/src/main/java/org/apache/camel/quarkus/component/xml/jaxb/XmlJaxbRecorder.java b/extensions-core/xml-jaxb/runtime/src/main/java/org/apache/camel/quarkus/component/xml/jaxb/XmlJaxbRecorder.java index 3cb9e69..260da00 100644 --- a/extensions-core/xml-jaxb/runtime/src/main/java/org/apache/camel/quarkus/component/xml/jaxb/XmlJaxbRecorder.java +++ b/extensions-core/xml-jaxb/runtime/src/main/java/org/apache/camel/quarkus/component/xml/jaxb/XmlJaxbRecorder.java @@ -21,10 +21,10 @@ import javax.xml.bind.JAXBException; 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.spi.ModelJAXBContextFactory; import org.apache.camel.spi.ModelToXMLDumper; import org.apache.camel.spi.XMLRoutesDefinitionLoader; +import org.apache.camel.xml.jaxb.DefaultModelJAXBContextFactory; import org.apache.camel.xml.jaxb.JaxbModelToXMLDumper; import org.apache.camel.xml.jaxb.JaxbXMLRoutesDefinitionLoader; import org.graalvm.nativeimage.ImageInfo; diff --git a/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteComponentConfigurer.java b/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteComponentConfigurer.java index 37d5e07..0e903b1 100644 --- a/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteComponentConfigurer.java +++ b/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteComponentConfigurer.java @@ -1,29 +1,55 @@ /* Generated by camel build tools - do NOT edit this file! */ package org.apache.camel.component.qute; +import java.util.Map; + import org.apache.camel.CamelContext; import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.util.CaseInsensitiveMap; import org.apache.camel.support.component.PropertyConfigurerSupport; /** * Generated by camel build tools - do NOT edit this file! */ @SuppressWarnings("unchecked") -public class QuteComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer { +public class QuteComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { @Override public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { QuteComponent target = (QuteComponent) obj; switch (ignoreCase ? name.toLowerCase() : name) { - case "lazystartproducer": - case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true; case "basicpropertybinding": case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true; + case "lazystartproducer": + case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true; case "quteengine": case "quteEngine": target.setQuteEngine(property(camelContext, io.quarkus.qute.Engine.class, value)); return true; default: return false; } } + @Override + public Map<String, Object> getAllOptions(Object target) { + Map<String, Object> answer = new CaseInsensitiveMap(); + answer.put("basicPropertyBinding", boolean.class); + answer.put("lazyStartProducer", boolean.class); + answer.put("quteEngine", io.quarkus.qute.Engine.class); + return answer; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + QuteComponent target = (QuteComponent) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "basicpropertybinding": + case "basicPropertyBinding": return target.isBasicPropertyBinding(); + case "lazystartproducer": + case "lazyStartProducer": return target.isLazyStartProducer(); + case "quteengine": + case "quteEngine": return target.getQuteEngine(); + default: return null; + } + } } diff --git a/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointConfigurer.java b/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointConfigurer.java index 86093a9..059e63e 100644 --- a/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointConfigurer.java +++ b/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointConfigurer.java @@ -1,31 +1,61 @@ /* Generated by camel build tools - do NOT edit this file! */ package org.apache.camel.component.qute; +import java.util.Map; + import org.apache.camel.CamelContext; import org.apache.camel.spi.GeneratedPropertyConfigurer; +import org.apache.camel.spi.PropertyConfigurerGetter; +import org.apache.camel.util.CaseInsensitiveMap; import org.apache.camel.support.component.PropertyConfigurerSupport; /** * Generated by camel build tools - do NOT edit this file! */ @SuppressWarnings("unchecked") -public class QuteEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer { +public class QuteEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter { @Override public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) { QuteEndpoint target = (QuteEndpoint) obj; switch (ignoreCase ? name.toLowerCase() : name) { + case "basicpropertybinding": + case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true; case "contentcache": case "contentCache": target.setContentCache(property(camelContext, boolean.class, value)); return true; case "encoding": target.setEncoding(property(camelContext, java.lang.String.class, value)); return true; case "lazystartproducer": case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true; - case "basicpropertybinding": - case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true; case "synchronous": target.setSynchronous(property(camelContext, boolean.class, value)); return true; default: return false; } } + @Override + public Map<String, Object> getAllOptions(Object target) { + Map<String, Object> answer = new CaseInsensitiveMap(); + answer.put("basicPropertyBinding", boolean.class); + answer.put("contentCache", boolean.class); + answer.put("encoding", java.lang.String.class); + answer.put("lazyStartProducer", boolean.class); + answer.put("synchronous", boolean.class); + return answer; + } + + @Override + public Object getOptionValue(Object obj, String name, boolean ignoreCase) { + QuteEndpoint target = (QuteEndpoint) obj; + switch (ignoreCase ? name.toLowerCase() : name) { + case "basicpropertybinding": + case "basicPropertyBinding": return target.isBasicPropertyBinding(); + case "contentcache": + case "contentCache": return target.isContentCache(); + case "encoding": return target.getEncoding(); + case "lazystartproducer": + case "lazyStartProducer": return target.isLazyStartProducer(); + case "synchronous": return target.isSynchronous(); + default: return null; + } + } } diff --git a/extensions/qute/component/src/generated/resources/org/apache/camel/component/qute/qute.json b/extensions/qute/component/src/generated/resources/org/apache/camel/component/qute/qute.json index c50c6d4..486d247 100644 --- a/extensions/qute/component/src/generated/resources/org/apache/camel/component/qute/qute.json +++ b/extensions/qute/component/src/generated/resources/org/apache/camel/component/qute/qute.json @@ -1,6 +1,7 @@ { "component": { "kind": "component", + "name": "qute", "scheme": "qute", "extendsScheme": "", "syntax": "qute:resourceUri",
