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-quarkus.git

commit b7ad857c2a0820c7405f1717c4f63720e92bdf17
Author: lburgazzoli <lburgazz...@gmail.com>
AuthorDate: Mon Nov 11 11:24:35 2019 +0100

    Perform TypeConverterLoader discovery using jandex instead of camel's class 
path scanner
---
 .../quarkus/core/deployment/BuildProcessor.java    | 63 ++++++++++++++++++++++
 .../quarkus/core/deployment/CamelSupport.java      |  9 ++++
 .../CamelTypeConverterLoaderBuildItem.java         | 22 +++++---
 .../CamelTypeConverterRegistryBuildItem.java       | 23 +++++---
 .../apache/camel/quarkus/core/CamelRecorder.java   | 21 ++++++--
 .../camel/quarkus/core/FastCamelContext.java       | 22 ++++----
 .../camel/quarkus/core/FastTypeConverter.java      | 44 +++++++++++++++
 .../support/deployment/SupportBuildStep.java       |  7 +++
 .../support/{SupportRecorder.java => MyPair.java}  | 18 ++++---
 .../core/runtime/support/SupportRecorder.java      |  5 ++
 ...corder.java => SupportTypeConverterLoader.java} | 18 ++++---
 .../apache/camel/quarkus/core/CamelServlet.java    | 14 +++++
 .../org/apache/camel/quarkus/core/CamelTest.java   | 11 ++++
 13 files changed, 231 insertions(+), 46 deletions(-)

diff --git 
a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
 
b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
index 50478d4..5270ac7 100644
--- 
a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
+++ 
b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
@@ -16,11 +16,16 @@
  */
 package org.apache.camel.quarkus.core.deployment;
 
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.List;
 import java.util.stream.Collectors;
 
 import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
 import io.quarkus.arc.deployment.BeanContainerBuildItem;
+import io.quarkus.deployment.ApplicationArchive;
 import io.quarkus.deployment.Capabilities;
 import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
@@ -35,6 +40,7 @@ import io.quarkus.deployment.recording.RecorderContext;
 import io.quarkus.runtime.RuntimeValue;
 import org.apache.camel.CamelContext;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.impl.converter.BaseTypeConverterRegistry;
 import org.apache.camel.quarkus.core.CamelMain;
 import org.apache.camel.quarkus.core.CamelMainProducers;
 import org.apache.camel.quarkus.core.CamelMainRecorder;
@@ -46,11 +52,15 @@ import org.apache.camel.quarkus.core.Flags;
 import org.apache.camel.quarkus.core.UploadAttacher;
 import org.apache.camel.quarkus.support.common.CamelCapabilities;
 import org.apache.camel.spi.Registry;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.jboss.jandex.DotName;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 class BuildProcessor {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(BuildProcessor.class);
+    private static final DotName TYPE_CONVERTER_LOADER_TYPE = 
DotName.createSimple(TypeConverterLoader.class.getName());
 
     /*
      * Build steps related to camel core.
@@ -71,6 +81,57 @@ class BuildProcessor {
                     new 
CamelServiceFilterBuildItem(CamelServiceFilter.forService("properties-component-factory")));
         }
 
+        /*
+         * Discover {@link TypeConverterLoader}.
+         */
+        @Record(ExecutionTime.STATIC_INIT)
+        @BuildStep
+        CamelTypeConverterRegistryBuildItem typeConverterRegistry(
+                CamelRecorder recorder,
+                RecorderContext recorderContext,
+                ApplicationArchivesBuildItem applicationArchives,
+                List<CamelTypeConverterLoaderBuildItem> additionalLoaders) {
+
+            RuntimeValue<TypeConverterRegistry> typeConverterRegistry = 
recorder.createTypeConverterRegistry();
+
+            //
+            // This should be simplified by searching for classes implementing 
TypeConverterLoader but that
+            // would lead to have 
org.apache.camel.impl.converter.AnnotationTypeConverterLoader taken into
+            // account even if it should not.
+            //
+            // TODO: we could add a filter to discard 
AnnotationTypeConverterLoader but maybe we should introduce
+            //       a marker interface like StaticTypeConverterLoader for 
loaders that do not require to perform
+            //       any discovery at runtime.
+            //
+            for (ApplicationArchive archive : 
applicationArchives.getAllApplicationArchives()) {
+                Path path = 
archive.getArchiveRoot().resolve(BaseTypeConverterRegistry.META_INF_SERVICES_TYPE_CONVERTER_LOADER);
+                if (!Files.isRegularFile(path)) {
+                    continue;
+                }
+
+                try {
+                    Files.readAllLines(path, StandardCharsets.UTF_8).stream()
+                            .map(String::trim)
+                            .filter(l -> !l.isEmpty())
+                            .filter(l -> !l.startsWith("#"))
+                            .map(l -> recorderContext.<TypeConverterLoader> 
newInstance(l))
+                            .forEach(loader -> 
recorder.addTypeConverterLoader(typeConverterRegistry, loader));
+                } catch (IOException e) {
+                    throw new RuntimeException("Error discovering 
TypeConverterLoader", e);
+                }
+            }
+
+            //
+            // User can register loaders by providing a 
CamelTypeConverterLoaderBuildItem that can be used to
+            // provide additional TypeConverter or override default converters 
discovered by the previous step.
+            //
+            for (CamelTypeConverterLoaderBuildItem item : additionalLoaders) {
+                recorder.addTypeConverterLoader(typeConverterRegistry, 
item.getValue());
+            }
+
+            return new 
CamelTypeConverterRegistryBuildItem(typeConverterRegistry);
+        }
+
         @Record(ExecutionTime.STATIC_INIT)
         @BuildStep
         CamelRegistryBuildItem registry(
@@ -147,12 +208,14 @@ class BuildProcessor {
         CamelContextBuildItem context(
                 CamelRecorder recorder,
                 CamelRegistryBuildItem registry,
+                CamelTypeConverterRegistryBuildItem typeConverterRegistry,
                 CamelModelJAXBContextFactoryBuildItem contextFactory,
                 CamelXmlLoaderBuildItem xmlLoader,
                 BeanContainerBuildItem beanContainer) {
 
             RuntimeValue<CamelContext> context = recorder.createContext(
                     registry.getRegistry(),
+                    typeConverterRegistry.getRegistry(),
                     contextFactory.getContextFactory(),
                     xmlLoader.getXmlLoader(),
                     beanContainer.getValue());
diff --git 
a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSupport.java
 
b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSupport.java
index 7c935cb..e945ecc 100644
--- 
a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSupport.java
+++ 
b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSupport.java
@@ -32,6 +32,7 @@ import java.util.Set;
 import java.util.stream.Stream;
 
 import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
+import io.quarkus.deployment.recording.RecorderContext;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.AdviceWithRouteBuilder;
 import org.apache.camel.builder.RouteBuilder;
@@ -87,6 +88,14 @@ public final class CamelSupport {
                 .map(ClassInfo::toString);
     }
 
+    public static CamelBeanBuildItem createBeanFromType(RecorderContext 
context, String type) {
+        return new CamelBeanBuildItem(type, context.classProxy(type), 
context.newInstance(type));
+    }
+
+    public static CamelBeanBuildItem createBeanFromType(RecorderContext 
context, ClassInfo info) {
+        return createBeanFromType(context, info.name().toString());
+    }
+
     public static Stream<CamelServiceInfo> 
services(ApplicationArchivesBuildItem applicationArchivesBuildItem) {
         return CamelSupport.resources(applicationArchivesBuildItem, 
CamelSupport.CAMEL_SERVICE_BASE_PATH)
                 .map(CamelSupport::services)
diff --git 
a/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
 
b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelTypeConverterLoaderBuildItem.java
similarity index 60%
copy from 
integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
copy to 
extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelTypeConverterLoaderBuildItem.java
index f9eaf3e..1b5626b 100644
--- 
a/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
+++ 
b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelTypeConverterLoaderBuildItem.java
@@ -14,15 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.runtime.support;
+package org.apache.camel.quarkus.core.deployment;
 
+import io.quarkus.builder.item.MultiBuildItem;
 import io.quarkus.runtime.RuntimeValue;
-import io.quarkus.runtime.annotations.Recorder;
-import org.apache.camel.main.MainListener;
+import org.apache.camel.spi.TypeConverterLoader;
 
-@Recorder
-public class SupportRecorder {
-    public RuntimeValue<MainListener> createSupportListener() {
-        return new RuntimeValue<>(new SupportListener());
+/**
+ * Holds the {@link TypeConverterLoader} {@link RuntimeValue}.
+ */
+public final class CamelTypeConverterLoaderBuildItem extends MultiBuildItem {
+    private final RuntimeValue<TypeConverterLoader> value;
+
+    public CamelTypeConverterLoaderBuildItem(RuntimeValue<TypeConverterLoader> 
value) {
+        this.value = value;
+    }
+
+    public RuntimeValue<TypeConverterLoader> getValue() {
+        return value;
     }
 }
diff --git 
a/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
 
b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelTypeConverterRegistryBuildItem.java
similarity index 58%
copy from 
integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
copy to 
extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelTypeConverterRegistryBuildItem.java
index f9eaf3e..171644c 100644
--- 
a/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
+++ 
b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelTypeConverterRegistryBuildItem.java
@@ -14,15 +14,24 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.runtime.support;
+package org.apache.camel.quarkus.core.deployment;
 
+import org.apache.camel.spi.TypeConverterRegistry;
+
+import io.quarkus.builder.item.SimpleBuildItem;
 import io.quarkus.runtime.RuntimeValue;
-import io.quarkus.runtime.annotations.Recorder;
-import org.apache.camel.main.MainListener;
 
-@Recorder
-public class SupportRecorder {
-    public RuntimeValue<MainListener> createSupportListener() {
-        return new RuntimeValue<>(new SupportListener());
+/**
+ * Holds the {@link org.apache.camel.spi.TypeConverterRegistry} {@link 
RuntimeValue}.
+ */
+public final class CamelTypeConverterRegistryBuildItem extends SimpleBuildItem 
{
+    private final RuntimeValue<TypeConverterRegistry> value;
+
+    public 
CamelTypeConverterRegistryBuildItem(RuntimeValue<TypeConverterRegistry> value) {
+        this.value = value;
+    }
+
+    public RuntimeValue<TypeConverterRegistry> getRegistry() {
+        return value;
     }
 }
diff --git 
a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
 
b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
index d0d1ce1..c22926f 100644
--- 
a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
+++ 
b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
@@ -16,9 +16,6 @@
  */
 package org.apache.camel.quarkus.core;
 
-import io.quarkus.arc.runtime.BeanContainer;
-import io.quarkus.runtime.RuntimeValue;
-import io.quarkus.runtime.annotations.Recorder;
 import org.apache.camel.CamelContext;
 import org.apache.camel.model.ValidateDefinition;
 import org.apache.camel.model.validator.PredicateValidatorDefinition;
@@ -26,6 +23,12 @@ import org.apache.camel.reifier.ProcessorReifier;
 import org.apache.camel.reifier.validator.ValidatorReifier;
 import org.apache.camel.spi.ModelJAXBContextFactory;
 import org.apache.camel.spi.Registry;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+
+import io.quarkus.arc.runtime.BeanContainer;
+import io.quarkus.runtime.RuntimeValue;
+import io.quarkus.runtime.annotations.Recorder;
 
 @Recorder
 public class CamelRecorder {
@@ -33,20 +36,28 @@ public class CamelRecorder {
         return new RuntimeValue<>(new RuntimeRegistry());
     }
 
+    public RuntimeValue<TypeConverterRegistry> createTypeConverterRegistry() {
+        return new RuntimeValue<>(new FastTypeConverter());
+    }
+
+    public void addTypeConverterLoader(RuntimeValue<TypeConverterRegistry> 
registry, RuntimeValue<TypeConverterLoader> loader) {
+        loader.getValue().load(registry.getValue());
+    }
+
     @SuppressWarnings("unchecked")
     public RuntimeValue<CamelContext> createContext(
             RuntimeValue<Registry> registry,
+            RuntimeValue<TypeConverterRegistry> typeConverterRegistry,
             RuntimeValue<ModelJAXBContextFactory> contextFactory,
             RuntimeValue<XmlLoader> xmlLoader,
             BeanContainer beanContainer) {
         FastCamelContext context = new FastCamelContext();
         context.setRegistry(registry.getValue());
+        context.setTypeConverterRegistry(typeConverterRegistry.getValue());
         context.setLoadTypeConverters(false);
-        context.getTypeConverterRegistry().setInjector(context.getInjector());
         context.setModelJAXBContextFactory(contextFactory.getValue());
 
         FastModel model = new FastModel(context, xmlLoader.getValue());
-
         context.setModel(model);
         context.init();
 
diff --git 
a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
 
b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
index 54d32ff..a2bcaca 100644
--- 
a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
+++ 
b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
@@ -31,7 +31,6 @@ import org.apache.camel.TypeConverter;
 import 
org.apache.camel.component.microprofile.config.CamelMicroProfilePropertiesSource;
 import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.impl.DefaultExecutorServiceManager;
-import org.apache.camel.impl.converter.DefaultTypeConverter;
 import org.apache.camel.impl.engine.AbstractCamelContext;
 import org.apache.camel.impl.engine.BaseRouteService;
 import org.apache.camel.impl.engine.BeanProcessorFactoryResolver;
@@ -199,22 +198,12 @@ public class FastCamelContext extends 
AbstractCamelContext {
 
     @Override
     protected TypeConverter createTypeConverter() {
-        // lets use the new fast type converter registry
-        return new DefaultTypeConverter(
-                this,
-                getPackageScanClassResolver(),
-                getInjector(),
-                getDefaultFactoryFinder(),
-                isLoadTypeConverters());
+        throw new UnsupportedOperationException();
     }
 
     @Override
     protected TypeConverterRegistry createTypeConverterRegistry() {
-        TypeConverter typeConverter = getTypeConverter();
-        if (typeConverter instanceof TypeConverterRegistry) {
-            return (TypeConverterRegistry) typeConverter;
-        }
-        return null;
+        throw new UnsupportedOperationException();
     }
 
     @Override
@@ -390,6 +379,13 @@ public class FastCamelContext extends AbstractCamelContext 
{
     }
 
     @Override
+    public void setTypeConverterRegistry(TypeConverterRegistry 
typeConverterRegistry) {
+        super.setTypeConverterRegistry(typeConverterRegistry);
+
+        typeConverterRegistry.setCamelContext(this);
+    }
+
+    @Override
     public void doInit() throws Exception {
         super.doInit();
 
diff --git 
a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
 
b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
new file mode 100644
index 0000000..cc3012c
--- /dev/null
+++ 
b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
@@ -0,0 +1,44 @@
+/*
+ * 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.quarkus.core;
+
+import org.apache.camel.impl.converter.DefaultTypeConverter;
+import org.apache.camel.spi.TypeConverterLoader;
+
+public class FastTypeConverter extends DefaultTypeConverter {
+    public FastTypeConverter() {
+        super(null, null, null, null, false);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        for (TypeConverterLoader loader : 
getCamelContext().getRegistry().findByType(TypeConverterLoader.class)) {
+            log.debug("TypeConverterLoader: {} loading converters", loader);
+            loader.load(this);
+        }
+    }
+
+    @Override
+    public void loadCoreAndFastTypeConverters() throws Exception {
+        throw new IllegalStateException("This method should not be invoked");
+    }
+
+    @Override
+    protected void initTypeConverterLoaders() {
+        // no-op
+    }
+}
diff --git 
a/integration-tests/core-main/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/SupportBuildStep.java
 
b/integration-tests/core-main/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/SupportBuildStep.java
index 395a634..64a1260 100644
--- 
a/integration-tests/core-main/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/SupportBuildStep.java
+++ 
b/integration-tests/core-main/deployment/src/main/java/org/apache/camel/quarkus/core/runtime/support/deployment/SupportBuildStep.java
@@ -20,6 +20,7 @@ import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.annotations.ExecutionTime;
 import io.quarkus.deployment.annotations.Record;
 import org.apache.camel.quarkus.core.deployment.CamelMainListenerBuildItem;
+import 
org.apache.camel.quarkus.core.deployment.CamelTypeConverterLoaderBuildItem;
 import org.apache.camel.quarkus.core.runtime.support.SupportRecorder;
 
 public class SupportBuildStep {
@@ -28,4 +29,10 @@ public class SupportBuildStep {
     CamelMainListenerBuildItem listener(SupportRecorder recorder) {
         return new 
CamelMainListenerBuildItem(recorder.createSupportListener());
     }
+
+    @Record(ExecutionTime.STATIC_INIT)
+    @BuildStep
+    CamelTypeConverterLoaderBuildItem typeConverterLoader(SupportRecorder 
recorder) {
+        return new 
CamelTypeConverterLoaderBuildItem(recorder.createTypeConverterLoader());
+    }
 }
diff --git 
a/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
 
b/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/MyPair.java
similarity index 73%
copy from 
integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
copy to 
integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/MyPair.java
index f9eaf3e..07a8347 100644
--- 
a/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
+++ 
b/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/MyPair.java
@@ -16,13 +16,17 @@
  */
 package org.apache.camel.quarkus.core.runtime.support;
 
-import io.quarkus.runtime.RuntimeValue;
-import io.quarkus.runtime.annotations.Recorder;
-import org.apache.camel.main.MainListener;
+public class MyPair {
+    public final String key;
+    public final String val;
 
-@Recorder
-public class SupportRecorder {
-    public RuntimeValue<MainListener> createSupportListener() {
-        return new RuntimeValue<>(new SupportListener());
+    public MyPair(String key, String val) {
+        this.key = key;
+        this.val = val;
+    }
+
+    public static MyPair fromString(String input) {
+        String[] items = input.split(":");
+        return new MyPair(items[0], items[1]);
     }
 }
diff --git 
a/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
 
b/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
index f9eaf3e..ed27a84 100644
--- 
a/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
+++ 
b/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
@@ -19,10 +19,15 @@ package org.apache.camel.quarkus.core.runtime.support;
 import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.runtime.annotations.Recorder;
 import org.apache.camel.main.MainListener;
+import org.apache.camel.spi.TypeConverterLoader;
 
 @Recorder
 public class SupportRecorder {
     public RuntimeValue<MainListener> createSupportListener() {
         return new RuntimeValue<>(new SupportListener());
     }
+
+    public RuntimeValue<TypeConverterLoader> createTypeConverterLoader() {
+        return new RuntimeValue<>(new SupportTypeConverterLoader());
+    }
 }
diff --git 
a/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
 
b/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportTypeConverterLoader.java
similarity index 59%
copy from 
integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
copy to 
integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportTypeConverterLoader.java
index f9eaf3e..ff31293 100644
--- 
a/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportRecorder.java
+++ 
b/integration-tests/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportTypeConverterLoader.java
@@ -16,13 +16,17 @@
  */
 package org.apache.camel.quarkus.core.runtime.support;
 
-import io.quarkus.runtime.RuntimeValue;
-import io.quarkus.runtime.annotations.Recorder;
-import org.apache.camel.main.MainListener;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
 
-@Recorder
-public class SupportRecorder {
-    public RuntimeValue<MainListener> createSupportListener() {
-        return new RuntimeValue<>(new SupportListener());
+public class SupportTypeConverterLoader implements TypeConverterLoader {
+    @Override
+    public void load(TypeConverterRegistry registry) throws 
TypeConverterLoaderException {
+        registry.addTypeConverter(
+                MyPair.class,
+                String.class,
+                new SimpleTypeConverter(false, (type, exchange, value) -> 
MyPair.fromString((String) value)));
     }
 }
diff --git 
a/integration-tests/core-main/test/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
 
b/integration-tests/core-main/test/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
index 28a2a98..4edcafd 100644
--- 
a/integration-tests/core-main/test/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
+++ 
b/integration-tests/core-main/test/src/main/java/org/apache/camel/quarkus/core/CamelServlet.java
@@ -17,6 +17,7 @@
 package org.apache.camel.quarkus.core;
 
 import java.util.Set;
+
 import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
 import javax.json.Json;
@@ -34,6 +35,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.component.log.LogComponent;
 import org.apache.camel.component.timer.TimerComponent;
+import org.apache.camel.quarkus.core.runtime.support.MyPair;
 import org.apache.camel.reactive.vertx.VertXReactiveExecutor;
 import org.apache.camel.spi.ReactiveExecutor;
 import org.apache.camel.spi.Registry;
@@ -154,4 +156,16 @@ public class CamelServlet {
 
         return builder.build();
     }
+
+    @Path("/converter/my-pair")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public JsonObject fromStringToMyPair(String input) {
+        MyPair pair = context.getTypeConverter().convertTo(MyPair.class, 
input);
+
+        return Json.createObjectBuilder()
+                .add("key", pair.key)
+                .add("val", pair.val)
+                .build();
+    }
 }
diff --git 
a/integration-tests/core-main/test/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
 
b/integration-tests/core-main/test/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
index 66c6e0a..c780bcb 100644
--- 
a/integration-tests/core-main/test/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
+++ 
b/integration-tests/core-main/test/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
@@ -116,4 +116,15 @@ public class CamelTest {
         
assertThat(executor.getString("class")).isEqualTo(VertXReactiveExecutor.class.getName());
         assertThat(executor.getBoolean("configured")).isTrue();
     }
+
+    @Test
+    public void testCustomTypeConverter() {
+        RestAssured.given()
+                .contentType(ContentType.TEXT).body("a:b")
+                .accept(MediaType.APPLICATION_JSON)
+                .post("/test/converter/my-pair")
+                .then().body(
+                        "key", is("a"),
+                        "val", is("b"));
+    }
 }

Reply via email to