You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2020/03/04 08:58:11 UTC

[camel] 26/32: Move default service creation to camel-base SimpleCamelContext, move model related methods to DefaultCamelContext

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 <gn...@gmail.com>
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);
     }
 
 }