This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 73b7290d523c8290d756ca2c9167f53fb8d8a1f0 Author: Guillaume Nodet <[email protected]> AuthorDate: Wed Mar 4 07:57:21 2020 +0100 Move default service creation to camel-base SimpleCamelContext, move model related methods to DefaultCamelContext --- .../camel/impl/engine/AbstractCamelContext.java | 9 +- .../impl/engine/BaseExecutorServiceManager.java | 2 +- .../camel/impl/engine/SimpleCamelContext.java} | 106 +++--- .../camel/impl/AbstractModelCamelContext.java | 334 ------------------- .../org/apache/camel/impl/DefaultCamelContext.java | 369 ++++++++------------- 5 files changed, 187 insertions(+), 633 deletions(-) diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java index b9f94cf..3b61952 100644 --- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java @@ -45,6 +45,7 @@ import java.util.function.Supplier; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; +import org.apache.camel.CatalogCamelContext; import org.apache.camel.Component; import org.apache.camel.Consumer; import org.apache.camel.ConsumerTemplate; @@ -76,6 +77,7 @@ import org.apache.camel.SuspendableService; import org.apache.camel.TypeConverter; import org.apache.camel.VetoCamelContextStartException; import org.apache.camel.catalog.RuntimeCamelCatalog; +import org.apache.camel.health.HealthCheckRegistry; import org.apache.camel.impl.transformer.TransformerKey; import org.apache.camel.impl.validator.ValidatorKey; import org.apache.camel.spi.AnnotationBasedProcessorFactory; @@ -172,7 +174,8 @@ import static org.apache.camel.spi.UnitOfWork.MDC_CAMEL_CONTEXT_ID; /** * Represents the context used to configure routes and the policies to use. */ -public abstract class AbstractCamelContext extends ServiceSupport implements ExtendedCamelContext, Suspendable { +public abstract class AbstractCamelContext extends ServiceSupport + implements ExtendedCamelContext, CatalogCamelContext, Suspendable { private static final Logger LOG = LoggerFactory.getLogger(AbstractCamelContext.class); @@ -332,6 +335,8 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext // add the defer service startup listener this.startupListeners.add(deferStartupListener); + setDefaultExtension(HealthCheckRegistry.class, this::createHealthCheckRegistry); + if (init) { try { init(); @@ -4450,6 +4455,8 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext } } + protected abstract HealthCheckRegistry createHealthCheckRegistry(); + protected abstract ReactiveExecutor createReactiveExecutor(); protected abstract StreamCachingStrategy createStreamCachingStrategy(); diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java index 299f622..3428d2d 100644 --- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java @@ -54,7 +54,7 @@ import org.slf4j.LoggerFactory; /** * Base {@link org.apache.camel.spi.ExecutorServiceManager} which can be used for implementations */ -public abstract class BaseExecutorServiceManager extends ServiceSupport implements ExecutorServiceManager { +public class BaseExecutorServiceManager extends ServiceSupport implements ExecutorServiceManager { private static final Logger LOG = LoggerFactory.getLogger(BaseExecutorServiceManager.class); private final CamelContext camelContext; diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java similarity index 81% copy from core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java copy to core/camel-base/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java index 6fc27c8..1b9beac 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java @@ -14,52 +14,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.impl; +package org.apache.camel.impl.engine; +import java.util.Collection; import java.util.Map; +import java.util.concurrent.ExecutorService; +import org.apache.camel.AsyncProcessor; import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; +import org.apache.camel.Processor; import org.apache.camel.TypeConverter; import org.apache.camel.catalog.RuntimeCamelCatalog; import org.apache.camel.health.HealthCheckRegistry; import org.apache.camel.impl.converter.DefaultTypeConverter; -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.DefaultFactoryFinderResolver; -import org.apache.camel.impl.engine.DefaultHeadersMapFactory; -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.DefaultManagementNameStrategy; -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.DefaultShutdownStrategy; -import org.apache.camel.impl.engine.DefaultStreamCachingStrategy; -import org.apache.camel.impl.engine.DefaultTracer; -import org.apache.camel.impl.engine.DefaultUnitOfWorkFactory; -import org.apache.camel.impl.engine.DefaultUuidGenerator; -import org.apache.camel.impl.engine.EndpointKey; -import org.apache.camel.impl.engine.WebSpherePackageScanClassResolver; -import org.apache.camel.impl.engine.BaseServiceResolver; 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.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.BeanRepository; import org.apache.camel.spi.CamelBeanPostProcessor; import org.apache.camel.spi.CamelContextNameStrategy; import org.apache.camel.spi.ClassResolver; @@ -90,9 +66,11 @@ 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.support.DefaultRegistry; import org.slf4j.Logger; @@ -101,9 +79,9 @@ import org.slf4j.LoggerFactory; /** * Represents the context used to configure routes and the policies to use. */ -public class DefaultCamelContext extends AbstractModelCamelContext { +public class SimpleCamelContext extends AbstractCamelContext { - private static final Logger LOG = LoggerFactory.getLogger(DefaultCamelContext.class); + private static final Logger LOG = LoggerFactory.getLogger(SimpleCamelContext.class); /** * Creates the {@link CamelContext} using {@link DefaultRegistry} as @@ -111,28 +89,8 @@ public class DefaultCamelContext extends AbstractModelCamelContext { * <p/> * Use one of the other constructors to force use an explicit registry. */ - public DefaultCamelContext() { - } - - /** - * Creates the {@link CamelContext} using the given {@link BeanRepository} - * as first-choice repository, and the - * {@link org.apache.camel.support.SimpleRegistry} as fallback, via the - * {@link DefaultRegistry} implementation. - * - * @param repository the bean repository. - */ - public DefaultCamelContext(BeanRepository repository) { - super(new DefaultRegistry(repository)); - } - - /** - * Creates the {@link CamelContext} using the given registry - * - * @param registry the registry - */ - public DefaultCamelContext(Registry registry) { - super(registry); + public SimpleCamelContext() { + this(true); } /** @@ -145,11 +103,16 @@ public class DefaultCamelContext extends AbstractModelCamelContext { * * @param init whether to automatic initialize. */ - public DefaultCamelContext(boolean init) { + public SimpleCamelContext(boolean init) { super(init); } @Override + protected HealthCheckRegistry createHealthCheckRegistry() { + return new DefaultHealthCheckRegistry(this); + } + + @Override protected TypeConverter createTypeConverter() { return new DefaultTypeConverter(this, getPackageScanClassResolver(), getInjector(), getDefaultFactoryFinder(), isLoadTypeConverters()); @@ -255,11 +218,6 @@ public class DefaultCamelContext extends AbstractModelCamelContext { } @Override - protected HealthCheckRegistry createHealthCheckRegistry() { - return new DefaultHealthCheckRegistry(this); - } - - @Override protected ShutdownStrategy createShutdownStrategy() { return new DefaultShutdownStrategy(this); } @@ -283,11 +241,6 @@ public class DefaultCamelContext extends AbstractModelCamelContext { } @Override - protected ExecutorServiceManager createExecutorServiceManager() { - return new DefaultExecutorServiceManager(this); - } - - @Override protected UnitOfWorkFactory createUnitOfWorkFactory() { return new DefaultUnitOfWorkFactory(); } @@ -409,4 +362,23 @@ public class DefaultCamelContext extends AbstractModelCamelContext { .orElseGet(DefaultReactiveExecutor::new); } + @Override + public AsyncProcessor createMulticast(Collection<Processor> processors, ExecutorService executor, boolean shutdownExecutorService) { + return new MulticastProcessor(this, processors, null, true, executor, shutdownExecutorService, false, false, 0, null, false, false); + } + + @Override + protected ValidatorRegistry<ValidatorKey> createValidatorRegistry() { + return new DefaultValidatorRegistry(this); + } + + @Override + protected TransformerRegistry<TransformerKey> createTransformerRegistry() { + return new DefaultTransformerRegistry(this); + } + + @Override + protected ExecutorServiceManager createExecutorServiceManager() { + return new BaseExecutorServiceManager(this); + } } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java deleted file mode 100644 index b2f10f3..0000000 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.impl; - -import java.util.Collection; -import java.util.List; -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.Processor; -import org.apache.camel.health.HealthCheckRegistry; -import org.apache.camel.impl.engine.AbstractCamelContext; -import org.apache.camel.impl.engine.BaseRouteService; -import org.apache.camel.impl.engine.DefaultTransformerRegistry; -import org.apache.camel.impl.engine.DefaultValidatorRegistry; -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.cloud.ServiceCallConfigurationDefinition; -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.reifier.dataformat.DataFormatReifier; -import org.apache.camel.spi.DataFormat; -import org.apache.camel.spi.Registry; -import org.apache.camel.spi.TransformerRegistry; -import org.apache.camel.spi.ValidatorRegistry; -import org.apache.camel.support.CamelContextHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Represents the context used to configure routes and the policies to use. - */ -public abstract class AbstractModelCamelContext extends AbstractCamelContext implements ModelCamelContext, CatalogCamelContext { - - private static final Logger LOG = LoggerFactory.getLogger(AbstractModelCamelContext.class); - - private final Model model = new DefaultModel(this); - - /** - * Creates the {@link ModelCamelContext} using - * {@link org.apache.camel.support.DefaultRegistry} as registry. - * <p/> - * Use one of the other constructors to force use an explicit registry. - */ - public AbstractModelCamelContext() { - this(true); - } - - /** - * Creates the {@link ModelCamelContext} using the given registry - * - * @param registry the registry - */ - public AbstractModelCamelContext(Registry registry) { - this(); - setRegistry(registry); - } - - public AbstractModelCamelContext(boolean init) { - super(false); - - setDefaultExtension(HealthCheckRegistry.class, this::createHealthCheckRegistry); - - if (init) { - init(); - } - } - - @Override - public List<RouteDefinition> getRouteDefinitions() { - return model.getRouteDefinitions(); - } - - @Override - public RouteDefinition getRouteDefinition(String id) { - return model.getRouteDefinition(id); - } - - @Override - public void addRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception { - if (isStarted() && !isAllowAddingNewRoutes()) { - throw new IllegalArgumentException("Adding new routes after CamelContext has been started is not allowed"); - } - model.addRouteDefinitions(routeDefinitions); - } - - @Override - public void addRouteDefinition(RouteDefinition routeDefinition) throws Exception { - if (isStarted() && !isAllowAddingNewRoutes()) { - throw new IllegalArgumentException("Adding new routes after CamelContext has been started is not allowed"); - } - model.addRouteDefinition(routeDefinition); - } - - @Override - public void removeRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception { - model.removeRouteDefinitions(routeDefinitions); - } - - @Override - public void removeRouteDefinition(RouteDefinition routeDefinition) throws Exception { - model.removeRouteDefinition(routeDefinition); - } - - @Override - public List<RestDefinition> getRestDefinitions() { - return model.getRestDefinitions(); - } - - @Override - public void addRestDefinitions(Collection<RestDefinition> restDefinitions, boolean addToRoutes) throws Exception { - if (isStarted() && !isAllowAddingNewRoutes()) { - throw new IllegalArgumentException("Adding new routes after CamelContext has been started is not allowed"); - } - model.addRestDefinitions(restDefinitions, addToRoutes); - } - - @Override - public void setDataFormats(Map<String, DataFormatDefinition> dataFormats) { - model.setDataFormats(dataFormats); - } - - @Override - public Map<String, DataFormatDefinition> getDataFormats() { - return model.getDataFormats(); - } - - @Override - public DataFormatDefinition resolveDataFormatDefinition(String name) { - return model.resolveDataFormatDefinition(name); - } - - @Override - public ProcessorDefinition<?> getProcessorDefinition(String id) { - return model.getProcessorDefinition(id); - } - - @Override - public <T extends ProcessorDefinition<T>> T getProcessorDefinition(String id, Class<T> type) { - return model.getProcessorDefinition(id, type); - } - - @Override - public void setValidators(List<ValidatorDefinition> validators) { - model.setValidators(validators); - } - - @Override - public HystrixConfigurationDefinition getHystrixConfiguration(String id) { - return model.getHystrixConfiguration(id); - } - - @Override - public void setHystrixConfiguration(HystrixConfigurationDefinition configuration) { - model.setHystrixConfiguration(configuration); - } - - @Override - public void setHystrixConfigurations(List<HystrixConfigurationDefinition> configurations) { - model.setHystrixConfigurations(configurations); - } - - @Override - public void addHystrixConfiguration(String id, HystrixConfigurationDefinition configuration) { - model.addHystrixConfiguration(id, configuration); - } - - @Override - public Resilience4jConfigurationDefinition getResilience4jConfiguration(String id) { - return model.getResilience4jConfiguration(id); - } - - @Override - public void setResilience4jConfiguration(Resilience4jConfigurationDefinition configuration) { - model.setResilience4jConfiguration(configuration); - } - - @Override - public void setResilience4jConfigurations(List<Resilience4jConfigurationDefinition> configurations) { - model.setResilience4jConfigurations(configurations); - } - - @Override - public void addResilience4jConfiguration(String id, Resilience4jConfigurationDefinition configuration) { - model.addResilience4jConfiguration(id, configuration); - } - - @Override - public List<ValidatorDefinition> getValidators() { - return model.getValidators(); - } - - @Override - public void setTransformers(List<TransformerDefinition> transformers) { - model.setTransformers(transformers); - } - - @Override - public List<TransformerDefinition> getTransformers() { - return model.getTransformers(); - } - - @Override - public ServiceCallConfigurationDefinition getServiceCallConfiguration(String serviceName) { - return model.getServiceCallConfiguration(serviceName); - } - - @Override - public void setServiceCallConfiguration(ServiceCallConfigurationDefinition configuration) { - model.setServiceCallConfiguration(configuration); - } - - @Override - public void setServiceCallConfigurations(List<ServiceCallConfigurationDefinition> configurations) { - model.setServiceCallConfigurations(configurations); - } - - @Override - public void addServiceCallConfiguration(String serviceName, ServiceCallConfigurationDefinition configuration) { - model.addServiceCallConfiguration(serviceName, configuration); - } - - @Override - public void setRouteFilterPattern(String include, String exclude) { - model.setRouteFilterPattern(include, exclude); - } - - @Override - public void setRouteFilter(Function<RouteDefinition, Boolean> filter) { - model.setRouteFilter(filter); - } - - @Override - public Function<RouteDefinition, Boolean> getRouteFilter() { - return model.getRouteFilter(); - } - - @Override - protected ValidatorRegistry<ValidatorKey> createValidatorRegistry() { - return new DefaultValidatorRegistry(this); - } - - @Override - protected TransformerRegistry<TransformerKey> createTransformerRegistry() { - return new DefaultTransformerRegistry(this); - } - - protected abstract HealthCheckRegistry createHealthCheckRegistry(); - - @Override - protected void doStartStandardServices() { - super.doStartStandardServices(); - } - - @Override - protected void doStartEagerServices() { - getExtension(HealthCheckRegistry.class); - super.doStartEagerServices(); - } - - @Override - protected void bindDataFormats() throws Exception { - // eager lookup data formats and bind to registry so the dataformats can - // be looked up and used - for (Map.Entry<String, DataFormatDefinition> e : model.getDataFormats().entrySet()) { - String id = e.getKey(); - DataFormatDefinition def = e.getValue(); - LOG.debug("Creating Dataformat with id: {} and definition: {}", id, def); - DataFormat df = DataFormatReifier.reifier(this, def).createDataFormat(); - addService(df, true); - getRegistry().bind(id, df); - } - } - - @Override - protected synchronized void shutdownRouteService(BaseRouteService routeService) throws Exception { - if (routeService instanceof RouteService) { - model.getRouteDefinitions().remove(((RouteService)routeService).getRouteDefinition()); - } - super.shutdownRouteService(routeService); - } - - @Override - protected boolean isStreamCachingInUse() throws Exception { - boolean streamCachingInUse = super.isStreamCachingInUse(); - if (!streamCachingInUse) { - for (RouteDefinition route : model.getRouteDefinitions()) { - Boolean routeCache = CamelContextHelper.parseBoolean(this, route.getStreamCache()); - if (routeCache != null && routeCache) { - streamCachingInUse = true; - break; - } - } - } - return streamCachingInUse; - } - - @Override - public void startRouteDefinitions() throws Exception { - model.startRouteDefinitions(); - } - - @Override - public AsyncProcessor createMulticast(Collection<Processor> processors, ExecutorService executor, boolean shutdownExecutorService) { - return new MulticastProcessor(this, processors, null, true, executor, shutdownExecutorService, false, false, 0, null, false, false); - } - -} diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java index 6fc27c8..c5f56f1 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java @@ -16,84 +16,32 @@ */ package org.apache.camel.impl; +import java.util.Collection; +import java.util.List; import java.util.Map; +import java.util.function.Function; import org.apache.camel.CamelContext; -import org.apache.camel.Endpoint; -import org.apache.camel.TypeConverter; -import org.apache.camel.catalog.RuntimeCamelCatalog; import org.apache.camel.health.HealthCheckRegistry; -import org.apache.camel.impl.converter.DefaultTypeConverter; -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.DefaultFactoryFinderResolver; -import org.apache.camel.impl.engine.DefaultHeadersMapFactory; -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.DefaultManagementNameStrategy; -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.DefaultShutdownStrategy; -import org.apache.camel.impl.engine.DefaultStreamCachingStrategy; -import org.apache.camel.impl.engine.DefaultTracer; -import org.apache.camel.impl.engine.DefaultUnitOfWorkFactory; -import org.apache.camel.impl.engine.DefaultUuidGenerator; -import org.apache.camel.impl.engine.EndpointKey; -import org.apache.camel.impl.engine.WebSpherePackageScanClassResolver; -import org.apache.camel.impl.engine.BaseServiceResolver; -import org.apache.camel.impl.health.DefaultHealthCheckRegistry; -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.impl.engine.BaseRouteService; +import org.apache.camel.impl.engine.SimpleCamelContext; +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.cloud.ServiceCallConfigurationDefinition; +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.reifier.dataformat.DataFormatReifier; import org.apache.camel.spi.BeanRepository; -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.DataFormatResolver; -import org.apache.camel.spi.EndpointRegistry; +import org.apache.camel.spi.DataFormat; import org.apache.camel.spi.ExecutorServiceManager; -import org.apache.camel.spi.FactoryFinder; -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.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.TypeConverterRegistry; -import org.apache.camel.spi.UnitOfWorkFactory; -import org.apache.camel.spi.UuidGenerator; -import org.apache.camel.spi.XMLRoutesDefinitionLoader; +import org.apache.camel.support.CamelContextHelper; import org.apache.camel.support.DefaultRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -101,17 +49,20 @@ import org.slf4j.LoggerFactory; /** * Represents the context used to configure routes and the policies to use. */ -public class DefaultCamelContext extends AbstractModelCamelContext { +public abstract class DefaultCamelContext extends SimpleCamelContext implements ModelCamelContext { private static final Logger LOG = LoggerFactory.getLogger(DefaultCamelContext.class); + private final Model model = new DefaultModel(this); + /** - * Creates the {@link CamelContext} using {@link DefaultRegistry} as - * registry. + * Creates the {@link ModelCamelContext} using + * {@link org.apache.camel.support.DefaultRegistry} as registry. * <p/> * Use one of the other constructors to force use an explicit registry. */ public DefaultCamelContext() { + this(true); } /** @@ -123,290 +74,248 @@ public class DefaultCamelContext extends AbstractModelCamelContext { * @param repository the bean repository. */ public DefaultCamelContext(BeanRepository repository) { - super(new DefaultRegistry(repository)); + this(new DefaultRegistry(repository)); } /** - * Creates the {@link CamelContext} using the given registry + * Creates the {@link ModelCamelContext} using the given registry * * @param registry the registry */ public DefaultCamelContext(Registry registry) { - super(registry); + this(); + setRegistry(registry); } - /** - * Creates the {@link CamelContext} and allows to control whether the - * context should automatic initialize or not. - * <p/> - * This is used by some Camel components such as camel-cdi and - * camel-blueprint, however this constructor is not intended for regular - * Camel end users. - * - * @param init whether to automatic initialize. - */ public DefaultCamelContext(boolean init) { super(init); } @Override - protected TypeConverter createTypeConverter() { - return new DefaultTypeConverter(this, getPackageScanClassResolver(), getInjector(), - getDefaultFactoryFinder(), isLoadTypeConverters()); + public List<RouteDefinition> getRouteDefinitions() { + return model.getRouteDefinitions(); } @Override - protected TypeConverterRegistry createTypeConverterRegistry() { - TypeConverter typeConverter = getTypeConverter(); - // type converter is also registry so create type converter - if (typeConverter == null) { - typeConverter = createTypeConverter(); - } - if (typeConverter instanceof TypeConverterRegistry) { - return (TypeConverterRegistry)typeConverter; - } - return null; + public RouteDefinition getRouteDefinition(String id) { + return model.getRouteDefinition(id); } @Override - protected Injector createInjector() { - FactoryFinder finder = getDefaultFactoryFinder(); - return finder.newInstance("Injector", Injector.class).orElse(new DefaultInjector(this)); - } - - @Override - protected PropertiesComponent createPropertiesComponent() { - return new BaseServiceResolver<>(PropertiesComponent.FACTORY, PropertiesComponent.class) - .resolve(this) - .orElseGet(org.apache.camel.component.properties.PropertiesComponent::new); + public void addRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception { + if (isStarted() && !isAllowAddingNewRoutes()) { + throw new IllegalArgumentException("Adding new routes after CamelContext has been started is not allowed"); + } + model.addRouteDefinitions(routeDefinitions); } @Override - protected CamelBeanPostProcessor createBeanPostProcessor() { - return new DefaultCamelBeanPostProcessor(this); + public void addRouteDefinition(RouteDefinition routeDefinition) throws Exception { + if (isStarted() && !isAllowAddingNewRoutes()) { + throw new IllegalArgumentException("Adding new routes after CamelContext has been started is not allowed"); + } + model.addRouteDefinition(routeDefinition); } @Override - protected ComponentResolver createComponentResolver() { - return new DefaultComponentResolver(); + public void removeRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception { + model.removeRouteDefinitions(routeDefinitions); } @Override - protected Registry createRegistry() { - return new DefaultRegistry(); + public void removeRouteDefinition(RouteDefinition routeDefinition) throws Exception { + model.removeRouteDefinition(routeDefinition); } @Override - protected UuidGenerator createUuidGenerator() { - return new DefaultUuidGenerator(); + public List<RestDefinition> getRestDefinitions() { + return model.getRestDefinitions(); } @Override - protected ModelJAXBContextFactory createModelJAXBContextFactory() { - return new BaseServiceResolver<>(ModelJAXBContextFactory.FACTORY, ModelJAXBContextFactory.class) - .resolve(this) - .orElseThrow(() -> new IllegalArgumentException("Cannot find ModelJAXBContextFactory on classpath. " - + "Add camel-xml-jaxb to classpath.")); + public void addRestDefinitions(Collection<RestDefinition> restDefinitions, boolean addToRoutes) throws Exception { + if (isStarted() && !isAllowAddingNewRoutes()) { + throw new IllegalArgumentException("Adding new routes after CamelContext has been started is not allowed"); + } + model.addRestDefinitions(restDefinitions, addToRoutes); } @Override - protected NodeIdFactory createNodeIdFactory() { - return new DefaultNodeIdFactory(); + public void setDataFormats(Map<String, DataFormatDefinition> dataFormats) { + model.setDataFormats(dataFormats); } @Override - protected FactoryFinderResolver createFactoryFinderResolver() { - return new DefaultFactoryFinderResolver(); + public Map<String, DataFormatDefinition> getDataFormats() { + return model.getDataFormats(); } @Override - protected ClassResolver createClassResolver() { - return new DefaultClassResolver(this); + public DataFormatDefinition resolveDataFormatDefinition(String name) { + return model.resolveDataFormatDefinition(name); } @Override - protected ProcessorFactory createProcessorFactory() { - return new DefaultProcessorFactory(); + public ProcessorDefinition<?> getProcessorDefinition(String id) { + return model.getProcessorDefinition(id); } @Override - protected DataFormatResolver createDataFormatResolver() { - return new DefaultDataFormatResolver(); + public <T extends ProcessorDefinition<T>> T getProcessorDefinition(String id, Class<T> type) { + return model.getProcessorDefinition(id, type); } @Override - protected MessageHistoryFactory createMessageHistoryFactory() { - return new DefaultMessageHistoryFactory(); + public void setValidators(List<ValidatorDefinition> validators) { + model.setValidators(validators); } @Override - protected InflightRepository createInflightRepository() { - return new DefaultInflightRepository(); + public HystrixConfigurationDefinition getHystrixConfiguration(String id) { + return model.getHystrixConfiguration(id); } @Override - protected AsyncProcessorAwaitManager createAsyncProcessorAwaitManager() { - return new DefaultAsyncProcessorAwaitManager(); + public void setHystrixConfiguration(HystrixConfigurationDefinition configuration) { + model.setHystrixConfiguration(configuration); } @Override - protected RouteController createRouteController() { - return new DefaultRouteController(this); + public void setHystrixConfigurations(List<HystrixConfigurationDefinition> configurations) { + model.setHystrixConfigurations(configurations); } @Override - protected HealthCheckRegistry createHealthCheckRegistry() { - return new DefaultHealthCheckRegistry(this); + public void addHystrixConfiguration(String id, HystrixConfigurationDefinition configuration) { + model.addHystrixConfiguration(id, configuration); } @Override - protected ShutdownStrategy createShutdownStrategy() { - return new DefaultShutdownStrategy(this); + public Resilience4jConfigurationDefinition getResilience4jConfiguration(String id) { + return model.getResilience4jConfiguration(id); } @Override - protected PackageScanClassResolver createPackageScanClassResolver() { - PackageScanClassResolver packageScanClassResolver; - // use WebSphere specific resolver if running on WebSphere - if (WebSpherePackageScanClassResolver.isWebSphereClassLoader(this.getClass().getClassLoader())) { - LOG.info("Using WebSphere specific PackageScanClassResolver"); - packageScanClassResolver = new WebSpherePackageScanClassResolver("META-INF/services/org/apache/camel/TypeConverter"); - } else { - packageScanClassResolver = new DefaultPackageScanClassResolver(); - } - return packageScanClassResolver; + public void setResilience4jConfiguration(Resilience4jConfigurationDefinition configuration) { + model.setResilience4jConfiguration(configuration); } @Override - protected PackageScanResourceResolver createPackageScanResourceResolver() { - return new DefaultPackageScanResourceResolver(); + public void setResilience4jConfigurations(List<Resilience4jConfigurationDefinition> configurations) { + model.setResilience4jConfigurations(configurations); } @Override - protected ExecutorServiceManager createExecutorServiceManager() { - return new DefaultExecutorServiceManager(this); + public void addResilience4jConfiguration(String id, Resilience4jConfigurationDefinition configuration) { + model.addResilience4jConfiguration(id, configuration); } @Override - protected UnitOfWorkFactory createUnitOfWorkFactory() { - return new DefaultUnitOfWorkFactory(); + public List<ValidatorDefinition> getValidators() { + return model.getValidators(); } @Override - protected RuntimeCamelCatalog createRuntimeCamelCatalog() { - return new BaseServiceResolver<>(RuntimeCamelCatalog.FACTORY, RuntimeCamelCatalog.class) - .resolve(this) - .orElseThrow(() -> new IllegalArgumentException("Cannot find RuntimeCamelCatalog on classpath. " - + "Add camel-core-catalog to classpath.")); + public void setTransformers(List<TransformerDefinition> transformers) { + model.setTransformers(transformers); } @Override - protected CamelContextNameStrategy createCamelContextNameStrategy() { - return new DefaultCamelContextNameStrategy(); + public List<TransformerDefinition> getTransformers() { + return model.getTransformers(); } @Override - protected ManagementNameStrategy createManagementNameStrategy() { - return new DefaultManagementNameStrategy(this); + public ServiceCallConfigurationDefinition getServiceCallConfiguration(String serviceName) { + return model.getServiceCallConfiguration(serviceName); } @Override - protected HeadersMapFactory createHeadersMapFactory() { - return new BaseServiceResolver<>(HeadersMapFactory.FACTORY, HeadersMapFactory.class) - .resolve(this) - .orElseGet(DefaultHeadersMapFactory::new); + public void setServiceCallConfiguration(ServiceCallConfigurationDefinition configuration) { + model.setServiceCallConfiguration(configuration); } @Override - protected BeanProxyFactory createBeanProxyFactory() { - return new BaseServiceResolver<>(BeanProxyFactory.FACTORY, BeanProxyFactory.class) - .resolve(this) - .orElseThrow(() -> new IllegalArgumentException("Cannot find BeanProxyFactory on classpath. " - + "Add camel-bean to classpath.")); + public void setServiceCallConfigurations(List<ServiceCallConfigurationDefinition> configurations) { + model.setServiceCallConfigurations(configurations); } @Override - protected BeanProcessorFactory createBeanProcessorFactory() { - return new BaseServiceResolver<>(BeanProcessorFactory.FACTORY, BeanProcessorFactory.class) - .resolve(this) - .orElseThrow(() -> new IllegalArgumentException("Cannot find BeanProcessorFactory on classpath. " - + "Add camel-bean to classpath.")); + public void addServiceCallConfiguration(String serviceName, ServiceCallConfigurationDefinition configuration) { + model.addServiceCallConfiguration(serviceName, configuration); } @Override - protected BeanIntrospection createBeanIntrospection() { - return new DefaultBeanIntrospection(); + public void setRouteFilterPattern(String include, String exclude) { + model.setRouteFilterPattern(include, exclude); } @Override - protected XMLRoutesDefinitionLoader createXMLRoutesDefinitionLoader() { - return new BaseServiceResolver<>(XMLRoutesDefinitionLoader.FACTORY, XMLRoutesDefinitionLoader.class) - .resolve(this) - .orElseThrow(() -> new IllegalArgumentException("Cannot find XMLRoutesDefinitionLoader on classpath. " - + "Add either camel-xml-io or camel-xml-jaxb to classpath.")); + public void setRouteFilter(Function<RouteDefinition, Boolean> filter) { + model.setRouteFilter(filter); } @Override - protected ModelToXMLDumper createModelToXMLDumper() { - return new BaseServiceResolver<>(ModelToXMLDumper.FACTORY, ModelToXMLDumper.class) - .resolve(this) - .orElseThrow(() -> new IllegalArgumentException("Cannot find ModelToXMLDumper on classpath. " - + "Add camel-xml-jaxb to classpath.")); + public Function<RouteDefinition, Boolean> getRouteFilter() { + return model.getRouteFilter(); } @Override - protected Tracer createTracer() { - Tracer tracer = null; - if (getRegistry() != null) { - // lookup in registry - Map<String, Tracer> map = getRegistry().findByTypeWithName(Tracer.class); - if (map.size() == 1) { - tracer = map.values().iterator().next(); - } - } - if (tracer == null) { - tracer = getExtension(Tracer.class); - } - if (tracer == null) { - tracer = new DefaultTracer(); - setExtension(Tracer.class, tracer); - } - return tracer; + protected void doStartStandardServices() { + super.doStartStandardServices(); } @Override - protected LanguageResolver createLanguageResolver() { - return new DefaultLanguageResolver(); + protected void doStartEagerServices() { + getExtension(HealthCheckRegistry.class); + super.doStartEagerServices(); } @Override - protected ConfigurerResolver createConfigurerResolver() { - return new DefaultConfigurerResolver(); + protected void bindDataFormats() throws Exception { + // eager lookup data formats and bind to registry so the dataformats can + // be looked up and used + for (Map.Entry<String, DataFormatDefinition> e : model.getDataFormats().entrySet()) { + String id = e.getKey(); + DataFormatDefinition def = e.getValue(); + LOG.debug("Creating Dataformat with id: {} and definition: {}", id, def); + DataFormat df = DataFormatReifier.reifier(this, def).createDataFormat(); + addService(df, true); + getRegistry().bind(id, df); + } } @Override - protected RestRegistryFactory createRestRegistryFactory() { - return new BaseServiceResolver<>(RestRegistryFactory.FACTORY, RestRegistryFactory.class) - .resolve(this) - .orElseThrow(() -> new IllegalArgumentException("Cannot find RestRegistryFactory on classpath. " - + "Add camel-rest to classpath.")); + protected synchronized void shutdownRouteService(BaseRouteService routeService) throws Exception { + if (routeService instanceof RouteService) { + model.getRouteDefinitions().remove(((RouteService)routeService).getRouteDefinition()); + } + super.shutdownRouteService(routeService); } @Override - protected EndpointRegistry<EndpointKey> createEndpointRegistry(Map<EndpointKey, Endpoint> endpoints) { - return new DefaultEndpointRegistry(this, endpoints); + protected boolean isStreamCachingInUse() throws Exception { + boolean streamCachingInUse = super.isStreamCachingInUse(); + if (!streamCachingInUse) { + for (RouteDefinition route : model.getRouteDefinitions()) { + Boolean routeCache = CamelContextHelper.parseBoolean(this, route.getStreamCache()); + if (routeCache != null && routeCache) { + streamCachingInUse = true; + break; + } + } + } + return streamCachingInUse; } @Override - protected StreamCachingStrategy createStreamCachingStrategy() { - return new DefaultStreamCachingStrategy(); + public void startRouteDefinitions() throws Exception { + model.startRouteDefinitions(); } @Override - protected ReactiveExecutor createReactiveExecutor() { - return new BaseServiceResolver<>(ReactiveExecutor.FACTORY, ReactiveExecutor.class) - .resolve(this) - .orElseGet(DefaultReactiveExecutor::new); + protected ExecutorServiceManager createExecutorServiceManager() { + return new DefaultExecutorServiceManager(this); } }
