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

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

commit 3267b2f0961d2edf7d95db57e16372324be53e43
Author: lburgazzoli <lburgazz...@gmail.com>
AuthorDate: Fri Sep 4 14:34:25 2020 +0200

    CAMEL-14672: add migration instruction
---
 .../ROOT/pages/camel-3x-upgrade-guide-3_6.adoc     | 86 ++++++++++++++++++++++
 1 file changed, 86 insertions(+)

diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_6.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_6.adoc
index c8df30f..07a38bb 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_6.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_6.adoc
@@ -14,3 +14,89 @@ signatures in the Camel components which may change some of 
the existing singatu
 === Camel Karaf
 
 The following features has been removed due they become not compatible with 
OSGi: `camel-atmosphere-websocket`.
+
+=== Customizers
+
+The customizer, which are objects used to configure some of the Camel services 
such as component, language ad data formats, that were previously limited to 
Camel Spring Boot, are now consistently used across runtimes. 
+To make that possible, the interfaces have been changed and they do not use 
generics anymore.
+
+Impacted interfaces:
+
+* org.apache.camel.spi.ComponentCustomizer
+* org.apache.camel.spi.LanguageCustomizer
+* org.apache.camel.spi.DataFormatCustomizer
+
+As example the signature of the `ComponentCustomizer` interface in Camel 3.5 
is:
+
+[source,java]
+----
+@FunctionalInterface
+public interface ComponentCustomizer<T extends Component> {
+    /**
+     * Customize the specified {@link Component}.
+     *
+     * @param component the component to customize
+     */
+    void customize(T component);
+}
+----
+
+And below the Camel 3.6 version:
+
+[source,java]
+----
+@FunctionalInterface
+public interface ComponentCustomizer {
+    /**
+     * Customize the specified {@link Component}.
+     *
+     * @param name   the unique name of the component
+     * @param target the component to configure
+     */
+    void configure(String name, Component target);
+
+    /**
+     * Checks whether this customizer should be applied to the given {@link 
Component}.
+     *
+     * @param  name   the unique name of the component
+     * @param  target the component to configure
+     * @return        <tt>true</tt> if the customizer should be applied
+     */
+    default boolean isEnabled(String name, Component target) {
+        return true;
+    }
+
+    @Override
+    default int getOrder() {
+        return 0;
+    }
+}
+----
+
+As the customizer are now taken into account as part of the standard lifecycle 
of the `CamelContext`, to programmatically configure a component, it is enough 
to register the appropriate customizer in the `Registry` as example:
+
+[source,java]
+----
+public class Application {
+
+    public static void main(String args) throws Exception {
+        Main main = new Main();
+        main..addConfigurationClass(MyConfiguration.class);
+        main.run(args);
+    }
+
+    public static class MyConfiguration {
+        @BindToRegistry
+        public ComponentCustomizer logCustomizer() {
+            // Use a fluent Component Customizer builder to ease the process 
of creating an customizer.
+            return ComponentCustomizer.builder(LogComponent.class)
+                    .build(component -> component.setExchangeFormatter(new 
DefaultExchangeFormatter()));
+        }
+    }
+}
+----
+
+[NOTE]
+====
+As coneguence of this change, the Camel Spring Boot starters have been 
ameneded to use Customizers instead of creating instances of components, 
languages or data formats.
+====

Reply via email to