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")); + } }