You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/01/02 15:17:11 UTC

[camel] branch master updated (15776f7 -> 7b5147c)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git.


    from 15776f7  CAMEL-14348 - Camel-AWS Lambda: Add alias operations, deleteAlias docs regen
     new 972bbda5 CAMEL-14349: camel-core - Transformer and Validator registry should be on-demand
     new 7b5147c  Delete not used class

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../main/java/org/apache/camel/CamelContext.java   |  4 +-
 .../camel/impl/engine/AbstractCamelContext.java    | 40 ++++++++++----
 .../impl/engine/DefaultTransformerRegistry.java    | 10 ++++
 .../impl/engine/DefaultValidatorRegistry.java      | 12 +++++
 .../org/apache/camel/builder/RouteBuilder.java     | 30 +++++++++++
 .../apache/camel/builder/TransformerBuilder.java   |  3 ++
 .../org/apache/camel/builder/ValidatorBuilder.java |  3 ++
 .../camel/impl/AbstractModelCamelContext.java      | 26 ++-------
 .../transformer/CustomTransformeReifier.java       |  5 +-
 .../transformer/EndpointTransformeReifier.java     |  2 +-
 .../reifier/transformer/TransformerReifier.java    |  4 +-
 .../reifier/validator/CustomValidatorReifier.java  |  5 +-
 .../validator/EndpointValidatorReifier.java        |  2 +-
 .../validator/PredicateValidatorReifier.java       |  2 +-
 .../camel/reifier/validator/ValidatorReifier.java  |  4 +-
 .../core/xml/AbstractCamelContextFactoryBean.java  | 41 +++++++++++++++
 .../camel/impl/MultipleLifecycleStrategyTest.java  |  4 +-
 .../management/mbean/ModelCamelContextHelper.java  | 61 ----------------------
 .../management/ManagedNonManagedServiceTest.java   |  2 +-
 ...edProducerRouteAddRemoveRegisterAlwaysTest.java |  2 +-
 .../management/ManagedRouteAddRemoveTest.java      |  2 +-
 21 files changed, 150 insertions(+), 114 deletions(-)
 delete mode 100644 core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java


[camel] 02/02: Delete not used class

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 7b5147c69b468f525852d244930dfe61400fb0ea
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Jan 2 16:16:44 2020 +0100

    Delete not used class
---
 .../management/mbean/ModelCamelContextHelper.java  | 62 ----------------------
 1 file changed, 62 deletions(-)

diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java
deleted file mode 100644
index 70090bf..0000000
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java
+++ /dev/null
@@ -1,62 +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.management.mbean;
-
-import java.util.Iterator;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.model.Model;
-import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.ProcessorDefinitionHelper;
-import org.apache.camel.model.RouteDefinition;
-
-/**
- * A number of helper methods
- */
-@Deprecated
-public final class ModelCamelContextHelper {
-
-    /**
-     * Utility classes should not have a public constructor.
-     */
-    private ModelCamelContextHelper() {
-    }
-
-    /**
-     * Checks if any of the Camel routes is using an EIP with the given name
-     *
-     * @param camelContext  the Camel context
-     * @param name          the name of the EIP
-     * @return <tt>true</tt> if in use, <tt>false</tt> if not
-     */
-    public static boolean isEipInUse(CamelContext camelContext, String name) {
-        for (RouteDefinition route : camelContext.getExtension(Model.class).getRouteDefinitions()) {
-            if (name.equals(route.getInput().getShortName())) {
-                return true;
-            }
-            Iterator<ProcessorDefinition> it = ProcessorDefinitionHelper.filterTypeInOutputs(route.getOutputs(), ProcessorDefinition.class);
-            while (it.hasNext()) {
-                ProcessorDefinition def = it.next();
-                if (name.equals(def.getShortName())) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-}


[camel] 01/02: CAMEL-14349: camel-core - Transformer and Validator registry should be on-demand

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 972bbda5e4c883249933bc1fd5f24af9fb1d800c
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Jan 2 16:15:46 2020 +0100

    CAMEL-14349: camel-core - Transformer and Validator registry should be on-demand
---
 .../main/java/org/apache/camel/CamelContext.java   |  4 +--
 .../camel/impl/engine/AbstractCamelContext.java    | 40 +++++++++++++++------
 .../impl/engine/DefaultTransformerRegistry.java    | 10 ++++++
 .../impl/engine/DefaultValidatorRegistry.java      | 12 +++++++
 .../org/apache/camel/builder/RouteBuilder.java     | 30 ++++++++++++++++
 .../apache/camel/builder/TransformerBuilder.java   |  3 ++
 .../org/apache/camel/builder/ValidatorBuilder.java |  3 ++
 .../camel/impl/AbstractModelCamelContext.java      | 26 +++-----------
 .../transformer/CustomTransformeReifier.java       |  5 ++-
 .../transformer/EndpointTransformeReifier.java     |  2 +-
 .../reifier/transformer/TransformerReifier.java    |  4 +--
 .../reifier/validator/CustomValidatorReifier.java  |  5 ++-
 .../validator/EndpointValidatorReifier.java        |  2 +-
 .../validator/PredicateValidatorReifier.java       |  2 +-
 .../camel/reifier/validator/ValidatorReifier.java  |  4 +--
 .../core/xml/AbstractCamelContextFactoryBean.java  | 41 ++++++++++++++++++++++
 .../camel/impl/MultipleLifecycleStrategyTest.java  |  4 +--
 .../management/mbean/ModelCamelContextHelper.java  |  1 +
 .../management/ManagedNonManagedServiceTest.java   |  2 +-
 ...edProducerRouteAddRemoveRegisterAlwaysTest.java |  2 +-
 .../management/ManagedRouteAddRemoveTest.java      |  2 +-
 21 files changed, 151 insertions(+), 53 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
index 27537f9..ec962d6 100644
--- a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
@@ -910,7 +910,7 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
      * Gets the {@link org.apache.camel.spi.TransformerRegistry}
      * @return the TransformerRegistry
      */
-    TransformerRegistry<? extends ValueHolder<String>> getTransformerRegistry();
+    TransformerRegistry getTransformerRegistry();
 
     /**
      * Resolve a validator given from/to data type.
@@ -924,7 +924,7 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
      * Gets the {@link org.apache.camel.spi.ValidatorRegistry}
      * @return the ValidatorRegistry
      */
-    ValidatorRegistry<? extends ValueHolder<String>> getValidatorRegistry();
+    ValidatorRegistry getValidatorRegistry();
 
     /**
      * Sets global options that can be referenced in the camel context
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 a732d95..eddaf50 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
@@ -2524,10 +2524,6 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
         // re-create endpoint registry as the cache size limit may be set after the constructor of this instance was called.
         // and we needed to create endpoints up-front as it may be accessed before this context is started
         endpoints = doAddService(createEndpointRegistry(endpoints));
-        // Initialize declarative transformer registry
-        transformerRegistry = doAddService(createTransformerRegistry());
-        // Initialize declarative validator registry
-        validatorRegistry = doAddService(createValidatorRegistry());
 
         // optimised to not include runtimeEndpointRegistry unless startServices
         // its enabled or JMX statistics is in extended mode
@@ -3983,29 +3979,51 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
 
     @Override
     public Transformer resolveTransformer(String scheme) {
-        return transformerRegistry.resolveTransformer(new TransformerKey(scheme));
+        return getTransformerRegistry().resolveTransformer(new TransformerKey(scheme));
     }
 
     @Override
     public Transformer resolveTransformer(DataType from, DataType to) {
-        return transformerRegistry.resolveTransformer(new TransformerKey(from, to));
+        return getTransformerRegistry().resolveTransformer(new TransformerKey(from, to));
     }
 
     @Override
-    public TransformerRegistry<TransformerKey> getTransformerRegistry() {
+    public TransformerRegistry getTransformerRegistry() {
+        if (transformerRegistry == null) {
+            synchronized (lock) {
+                if (transformerRegistry == null) {
+                    setTransformerRegistry(createTransformerRegistry());
+                }
+            }
+        }
         return transformerRegistry;
     }
 
+    public void setTransformerRegistry(TransformerRegistry transformerRegistry) {
+        this.transformerRegistry = doAddService(transformerRegistry);
+    }
+
     @Override
     public Validator resolveValidator(DataType type) {
-        return validatorRegistry.resolveValidator(new ValidatorKey(type));
+        return getValidatorRegistry().resolveValidator(new ValidatorKey(type));
     }
 
     @Override
-    public ValidatorRegistry<ValidatorKey> getValidatorRegistry() {
+    public ValidatorRegistry getValidatorRegistry() {
+        if (validatorRegistry == null) {
+            synchronized (lock) {
+                if (validatorRegistry == null) {
+                    setValidatorRegistry(createValidatorRegistry());
+                }
+            }
+        }
         return validatorRegistry;
     }
 
+    public void setValidatorRegistry(ValidatorRegistry validatorRegistry) {
+        this.validatorRegistry = doAddService(validatorRegistry);
+    }
+
     @Override
     public void setSSLContextParameters(SSLContextParameters sslContextParameters) {
         this.sslContextParameters = sslContextParameters;
@@ -4200,8 +4218,8 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
 
     protected abstract EndpointRegistry<EndpointKey> createEndpointRegistry(Map<EndpointKey, Endpoint> endpoints);
 
-    protected abstract TransformerRegistry<TransformerKey> createTransformerRegistry() throws Exception;
+    protected abstract TransformerRegistry<TransformerKey> createTransformerRegistry();
 
-    protected abstract ValidatorRegistry<ValidatorKey> createValidatorRegistry() throws Exception;
+    protected abstract ValidatorRegistry<ValidatorKey> createValidatorRegistry();
 
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java
index c4530b1..eb1a12c 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java
@@ -21,10 +21,13 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.impl.transformer.TransformerKey;
+import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.Transformer;
 import org.apache.camel.spi.TransformerRegistry;
+import org.apache.camel.spi.Validator;
 import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.ObjectHelper;
 
 /**
@@ -82,6 +85,13 @@ public class DefaultTransformerRegistry extends AbstractDynamicRegistry<Transfor
     }
 
     @Override
+    public Transformer put(TransformerKey key, Transformer transformer) {
+        // ensure transformer is started before its being used
+        ServiceHelper.startService(transformer);
+        return super.put(key, transformer);
+    }
+
+    @Override
     public boolean isStatic(String scheme) {
         return isStatic(new TransformerKey(scheme));
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultValidatorRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultValidatorRegistry.java
index 8e3307c..a13f889 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultValidatorRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultValidatorRegistry.java
@@ -16,12 +16,17 @@
  */
 package org.apache.camel.impl.engine;
 
+import java.io.IOException;
+
 import org.apache.camel.CamelContext;
+import org.apache.camel.Service;
 import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.Validator;
 import org.apache.camel.spi.ValidatorRegistry;
 import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.service.ServiceHelper;
+import org.apache.camel.support.service.ServiceSupport;
 import org.apache.camel.util.ObjectHelper;
 
 /**
@@ -57,4 +62,11 @@ public class DefaultValidatorRegistry extends AbstractDynamicRegistry<ValidatorK
         return "ValidatorRegistry for " + context.getName() + ", capacity: " + maxCacheSize;
     }
 
+    @Override
+    public Validator put(ValidatorKey key, Validator validator) {
+        // ensure validator is started before its being used
+        ServiceHelper.startService(validator);
+        return super.put(key, validator);
+    }
+
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/RouteBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/RouteBuilder.java
index 90dadea..2d3e5d9 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/RouteBuilder.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/RouteBuilder.java
@@ -29,6 +29,9 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Ordered;
 import org.apache.camel.Route;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.ValueHolder;
+import org.apache.camel.impl.transformer.TransformerKey;
+import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.model.FromDefinition;
 import org.apache.camel.model.InterceptDefinition;
 import org.apache.camel.model.InterceptFromDefinition;
@@ -41,8 +44,15 @@ import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestConfigurationDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
+import org.apache.camel.model.transformer.TransformerDefinition;
+import org.apache.camel.model.validator.ValidatorDefinition;
+import org.apache.camel.reifier.transformer.TransformerReifier;
+import org.apache.camel.reifier.validator.ValidatorReifier;
+import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.RestConfiguration;
+import org.apache.camel.spi.Transformer;
+import org.apache.camel.spi.Validator;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.StringHelper;
 import org.apache.camel.util.function.ThrowingConsumer;
@@ -543,6 +553,16 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
         for (TransformerBuilder tdb : transformerBuilders) {
             tdb.configure(camelContext);
         }
+
+        // create and register transformers on transformer registry
+        for (TransformerDefinition def : camelContext.getExtension(Model.class).getTransformers()) {
+            Transformer transformer = TransformerReifier.reifier(def).createTransformer(camelContext);
+            camelContext.getTransformerRegistry().put(createTransformerKey(def), transformer);
+        }
+    }
+
+    private static ValueHolder<String> createTransformerKey(TransformerDefinition def) {
+        return ObjectHelper.isNotEmpty(def.getScheme()) ? new TransformerKey(def.getScheme()) : new TransformerKey(new DataType(def.getFromType()), new DataType(def.getToType()));
     }
 
     protected void populateValidators() {
@@ -553,6 +573,16 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
         for (ValidatorBuilder vb : validatorBuilders) {
             vb.configure(camelContext);
         }
+
+        // create and register validators on validator registry
+        for (ValidatorDefinition def : camelContext.getExtension(Model.class).getValidators()) {
+            Validator validator = ValidatorReifier.reifier(def).createValidator(camelContext);
+            camelContext.getValidatorRegistry().put(createValidatorKey(def), validator);
+        }
+    }
+
+    private static ValidatorKey createValidatorKey(ValidatorDefinition def) {
+        return new ValidatorKey(new DataType(def.getType()));
     }
 
     public RestsDefinition getRestCollection() {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/TransformerBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/TransformerBuilder.java
index 3996943f..f309911 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/TransformerBuilder.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/TransformerBuilder.java
@@ -185,6 +185,9 @@ public class TransformerBuilder {
             transformer.setToType(to);
         }
 
+        // force init of transformer registry
+        camelContext.getTransformerRegistry();
+
         camelContext.getExtension(Model.class).getTransformers().add(transformer);
     }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/ValidatorBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/ValidatorBuilder.java
index 13aa3b8..08d595b 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/ValidatorBuilder.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/ValidatorBuilder.java
@@ -165,6 +165,9 @@ public class ValidatorBuilder {
             throw new IllegalArgumentException("No Validator type was specified");
         }
 
+        // force init of validator registry
+        camelContext.getValidatorRegistry();
+
         validator.setType(type);
         camelContext.getExtension(Model.class).getValidators().add(validator);
     }
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
index 6a78a7c..b017356 100644
--- 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
@@ -257,31 +257,13 @@ public abstract class AbstractModelCamelContext extends AbstractCamelContext imp
     }
 
     @Override
-    protected ValidatorRegistry<ValidatorKey> createValidatorRegistry() throws Exception {
-        DefaultValidatorRegistry registry = new DefaultValidatorRegistry(this);
-        for (ValidatorDefinition def : getValidators()) {
-            Validator validator = ValidatorReifier.reifier(def).createValidator(this);
-            registry.put(createKey(def), doAddService(validator));
-        }
-        return registry;
-    }
-
-    private ValidatorKey createKey(ValidatorDefinition def) {
-        return new ValidatorKey(new DataType(def.getType()));
+    protected ValidatorRegistry<ValidatorKey> createValidatorRegistry() {
+        return new DefaultValidatorRegistry(this);
     }
 
     @Override
-    protected TransformerRegistry<TransformerKey> createTransformerRegistry() throws Exception {
-        DefaultTransformerRegistry registry = new DefaultTransformerRegistry(this);
-        for (TransformerDefinition def : getTransformers()) {
-            Transformer transformer = TransformerReifier.reifier(def).createTransformer(this);
-            registry.put(createKey(def), doAddService(transformer));
-        }
-        return registry;
-    }
-
-    private TransformerKey createKey(TransformerDefinition def) {
-        return ObjectHelper.isNotEmpty(def.getScheme()) ? new TransformerKey(def.getScheme()) : new TransformerKey(new DataType(def.getFromType()), new DataType(def.getToType()));
+    protected TransformerRegistry<TransformerKey> createTransformerRegistry() {
+        return new DefaultTransformerRegistry(this);
     }
 
     protected abstract HealthCheckRegistry createHealthCheckRegistry();
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
index 6cfea73..049f00a 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
@@ -28,7 +28,7 @@ public class CustomTransformeReifier extends TransformerReifier<CustomTransforme
     }
 
     @Override
-    protected Transformer doCreateTransformer(CamelContext context) throws Exception {
+    protected Transformer doCreateTransformer(CamelContext context) {
         if (definition.getRef() == null && definition.getClassName() == null) {
             throw new IllegalArgumentException("'ref' or 'className' must be specified for customTransformer");
         }
@@ -42,12 +42,11 @@ public class CustomTransformeReifier extends TransformerReifier<CustomTransforme
                 throw new IllegalArgumentException(String.format("Transformer '%s' is already in use. Please check if duplicate transformer exists.", definition.getRef()));
             }
         } else {
-            Class<Transformer> transformerClass = context.getClassResolver().resolveMandatoryClass(definition.getClassName(), Transformer.class);
+            Class<Transformer> transformerClass = context.getClassResolver().resolveClass(definition.getClassName(), Transformer.class);
             if (transformerClass == null) {
                 throw new IllegalArgumentException("Cannot find transformer class: " + definition.getClassName());
             }
             transformer = context.getInjector().newInstance(transformerClass, false);
-
         }
         transformer.setCamelContext(context);
         return transformer.setModel(definition.getScheme()).setFrom(definition.getFromType()).setTo(definition.getToType());
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java
index 32b284c..b1afd5f 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java
@@ -32,7 +32,7 @@ public class EndpointTransformeReifier extends TransformerReifier<EndpointTransf
     }
 
     @Override
-    protected Transformer doCreateTransformer(CamelContext context) throws Exception {
+    protected Transformer doCreateTransformer(CamelContext context) {
         Endpoint endpoint = definition.getUri() != null ? context.getEndpoint(definition.getUri()) : context.getRegistry().lookupByNameAndType(definition.getRef(), Endpoint.class);
         SendProcessor processor = new SendProcessor(endpoint, ExchangePattern.InOut);
         return new ProcessorTransformer(context).setProcessor(processor).setModel(definition.getScheme()).setFrom(definition.getFromType()).setTo(definition.getToType());
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java
index b4c2b9e..f27b31a 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java
@@ -52,10 +52,10 @@ public abstract class TransformerReifier<T> {
         throw new IllegalStateException("Unsupported definition: " + definition);
     }
 
-    public Transformer createTransformer(CamelContext context) throws Exception {
+    public Transformer createTransformer(CamelContext context) {
         return doCreateTransformer(context);
     }
 
-    protected abstract Transformer doCreateTransformer(CamelContext context) throws Exception;
+    protected abstract Transformer doCreateTransformer(CamelContext context);
 
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
index 0d6118a..42e612b 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
@@ -28,7 +28,7 @@ public class CustomValidatorReifier extends ValidatorReifier<CustomValidatorDefi
     }
 
     @Override
-    protected Validator doCreateValidator(CamelContext context) throws Exception {
+    protected Validator doCreateValidator(CamelContext context) {
         if (definition.getRef() == null && definition.getClassName() == null) {
             throw new IllegalArgumentException("'ref' or 'type' must be specified for customValidator");
         }
@@ -42,12 +42,11 @@ public class CustomValidatorReifier extends ValidatorReifier<CustomValidatorDefi
                 throw new IllegalArgumentException(String.format("Validator '%s' is already in use. Please check if duplicate validator exists.", definition.getRef()));
             }
         } else {
-            Class<Validator> validatorClass = context.getClassResolver().resolveMandatoryClass(definition.getClassName(), Validator.class);
+            Class<Validator> validatorClass = context.getClassResolver().resolveClass(definition.getClassName(), Validator.class);
             if (validatorClass == null) {
                 throw new IllegalArgumentException("Cannot find validator class: " + definition.getClassName());
             }
             validator = context.getInjector().newInstance(validatorClass, false);
-
         }
         validator.setCamelContext(context);
         return validator.setType(definition.getType());
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java
index c8c4712..b8364df 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java
@@ -32,7 +32,7 @@ public class EndpointValidatorReifier extends ValidatorReifier<EndpointValidator
     }
 
     @Override
-    protected Validator doCreateValidator(CamelContext context) throws Exception {
+    protected Validator doCreateValidator(CamelContext context) {
         Endpoint endpoint = definition.getUri() != null ? context.getEndpoint(definition.getUri()) : context.getRegistry().lookupByNameAndType(definition.getRef(), Endpoint.class);
         SendProcessor processor = new SendProcessor(endpoint, ExchangePattern.InOut);
         return new ProcessorValidator(context).setProcessor(processor).setType(definition.getType());
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/PredicateValidatorReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/PredicateValidatorReifier.java
index 8fc8450..17c097b 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/PredicateValidatorReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/PredicateValidatorReifier.java
@@ -31,7 +31,7 @@ public class PredicateValidatorReifier extends ValidatorReifier<PredicateValidat
     }
 
     @Override
-    protected Validator doCreateValidator(CamelContext context) throws Exception {
+    protected Validator doCreateValidator(CamelContext context) {
         Predicate pred = definition.getExpression().createPredicate(context);
         PredicateValidatingProcessor processor = new PredicateValidatingProcessor(pred);
         return new ProcessorValidator(context).setProcessor(processor).setType(definition.getType());
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java
index 2de79e1..cc90525 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java
@@ -56,10 +56,10 @@ public abstract class ValidatorReifier<T> {
         throw new IllegalStateException("Unsupported definition: " + definition);
     }
 
-    public Validator createValidator(CamelContext context) throws Exception {
+    public Validator createValidator(CamelContext context) {
         return doCreateValidator(context);
     }
 
-    protected abstract Validator doCreateValidator(CamelContext context) throws Exception;
+    protected abstract Validator doCreateValidator(CamelContext context);
 
 }
diff --git a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index e094c23..314ce92 100644
--- a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -39,6 +39,7 @@ import org.apache.camel.ShutdownRoute;
 import org.apache.camel.ShutdownRunningTask;
 import org.apache.camel.TypeConverterExists;
 import org.apache.camel.TypeConverters;
+import org.apache.camel.ValueHolder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.cloud.ServiceRegistry;
@@ -51,6 +52,8 @@ import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.health.HealthCheckRepository;
 import org.apache.camel.health.HealthCheckService;
 import org.apache.camel.impl.engine.DefaultManagementStrategy;
+import org.apache.camel.impl.transformer.TransformerKey;
+import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.model.ContextScanDefinition;
 import org.apache.camel.model.FromDefinition;
 import org.apache.camel.model.GlobalOptionsDefinition;
@@ -76,13 +79,18 @@ import org.apache.camel.model.dataformat.DataFormatsDefinition;
 import org.apache.camel.model.rest.RestConfigurationDefinition;
 import org.apache.camel.model.rest.RestContainer;
 import org.apache.camel.model.rest.RestDefinition;
+import org.apache.camel.model.transformer.TransformerDefinition;
 import org.apache.camel.model.transformer.TransformersDefinition;
+import org.apache.camel.model.validator.ValidatorDefinition;
 import org.apache.camel.model.validator.ValidatorsDefinition;
 import org.apache.camel.processor.interceptor.BacklogTracer;
+import org.apache.camel.reifier.transformer.TransformerReifier;
+import org.apache.camel.reifier.validator.ValidatorReifier;
 import org.apache.camel.runtimecatalog.JSonSchemaResolver;
 import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.ClassResolver;
+import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.Debugger;
 import org.apache.camel.spi.EndpointStrategy;
 import org.apache.camel.spi.EventFactory;
@@ -111,9 +119,11 @@ import org.apache.camel.spi.ShutdownStrategy;
 import org.apache.camel.spi.StreamCachingStrategy;
 import org.apache.camel.spi.ThreadPoolFactory;
 import org.apache.camel.spi.ThreadPoolProfile;
+import org.apache.camel.spi.Transformer;
 import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.spi.UnitOfWorkFactory;
 import org.apache.camel.spi.UuidGenerator;
+import org.apache.camel.spi.Validator;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.ObjectHelper;
 import org.apache.camel.util.StringHelper;
@@ -427,6 +437,9 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
             // must init rest refs before we add the rests
             initRestRefs();
 
+            initTransformers();
+            initValidators();
+
             // cannot add rests as routes yet as we need to initialize this specially
             getContext().addRestDefinitions(getRests(), false);
 
@@ -474,6 +487,34 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         }
     }
 
+    private void initTransformers() {
+        if (getTransformers() != null) {
+            for (TransformerDefinition def : getTransformers().getTransformers()) {
+                // create and register transformers on transformer registry
+                Transformer transformer = TransformerReifier.reifier(def).createTransformer(getContext());
+                getContext().getTransformerRegistry().put(createTransformerKey(def), transformer);
+            }
+        }
+    }
+
+    private static ValueHolder<String> createTransformerKey(TransformerDefinition def) {
+        return org.apache.camel.util.ObjectHelper.isNotEmpty(def.getScheme()) ? new TransformerKey(def.getScheme()) : new TransformerKey(new DataType(def.getFromType()), new DataType(def.getToType()));
+    }
+
+    private void initValidators() {
+        if (getValidators() != null) {
+            for (ValidatorDefinition def : getValidators().getValidators()) {
+                // create and register validators on validator registry
+                Validator validator = ValidatorReifier.reifier(def).createValidator(getContext());
+                getContext().getValidatorRegistry().put(createValidatorKey(def), validator);
+            }
+        }
+    }
+
+    private static ValidatorKey createValidatorKey(ValidatorDefinition def) {
+        return new ValidatorKey(new DataType(def.getType()));
+    }
+
     /**
      * Do special preparation for some concepts such as interceptors and policies
      * this is needed as JAXB does not build exactly the same model definition as Spring DSL would do
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
index 7e503d3..76abf3c 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
@@ -51,8 +51,8 @@ public class MultipleLifecycleStrategyTest extends TestSupport {
 
         List<String> expectedEvents = Arrays.asList("onContextStart",
             "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
-            "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
-            "onServiceAdd", "onServiceAdd", "onServiceAdd", "onComponentAdd", "onEndpointAdd", "onComponentRemove", "onContextStop");
+            "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
+            "onComponentAdd", "onEndpointAdd", "onComponentRemove", "onContextStop");
         
         assertEquals(expectedEvents, dummy1.getEvents());
         assertEquals(expectedEvents, dummy2.getEvents());
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java
index d683c73..70090bf 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java
@@ -27,6 +27,7 @@ import org.apache.camel.model.RouteDefinition;
 /**
  * A number of helper methods
  */
+@Deprecated
 public final class ModelCamelContextHelper {
 
     /**
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
index 3d81dc5..3a249b5 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
@@ -29,7 +29,7 @@ import org.junit.Test;
 
 public class ManagedNonManagedServiceTest extends ManagementTestSupport {
 
-    private static final int SERVICES = 14;
+    private static final int SERVICES = 12;
 
     @Test
     public void testService() throws Exception {
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
index 8429a81..4bb974c 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
@@ -28,7 +28,7 @@ import org.junit.Test;
 
 public class ManagedProducerRouteAddRemoveRegisterAlwaysTest extends ManagementTestSupport {
 
-    private int services = 14;
+    private int services = 12;
 
     @Override
     protected CamelContext createCamelContext() throws Exception {
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
index 6ed0d66..339ec5f 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
@@ -33,7 +33,7 @@ import org.junit.Test;
  */
 public class ManagedRouteAddRemoveTest extends ManagementTestSupport {
     
-    private static final int SERVICES = 14;
+    private static final int SERVICES = 12;
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {