This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 7991e21 fix(platform-http): conversion fallback to InputStream (#6059) 7991e21 is described below commit 7991e21dddba07b3dd51b5b45efc8921097d5a8d Author: Pasquale Congiusti <pasquale.congiu...@gmail.com> AuthorDate: Thu Sep 9 08:58:39 2021 +0200 fix(platform-http): conversion fallback to InputStream (#6059) * fix(platform-http): conversion fallback to InputStream We are trying to convert to ByteBuffer if available, otherwise falling back to most generic InputStream Closes CAMEL-16906 * fix(dataformat/jackson): add conversion to InputStream Ref CAMEL-16906 * fix(dataformat/fastjson): add conversion to InputStream Ref CAMEL-16906 * fix(dataformat/gson): add conversion to InputStream Ref CAMEL-16906 * fix(dataformat/johnzon): add conversion to InputStream Ref CAMEL-16906 * fix(dataformat/jsonb): add conversion to InputStream Ref CAMEL-16906 * Fix: autogen and checkstyle --- .../converter/FastJsonTypeConvertersLoader.java | 59 ++++++++ .../services/org/apache/camel/TypeConverterLoader | 2 + .../fastjson/converter/FastJsonTypeConverters.java | 52 +++++++ .../converter/FastJsonConversionsTest.java} | 39 +++-- .../gson/converter/GsonTypeConvertersLoader.java | 59 ++++++++ .../services/org/apache/camel/TypeConverterLoader | 2 + .../gson/converter/GsonTypeConverters.java | 56 ++++++++ .../gson/conversion/GsonConversionsTest.java} | 39 +++-- .../jackson/converter/JacksonTypeConverters.java | 7 +- ...st.java => JacksonConversionsAdvancedTest.java} | 28 +++- .../converter/JohnzonTypeConvertersLoader.java | 59 ++++++++ .../services/org/apache/camel/TypeConverterLoader | 2 + .../johnzon/converter/JohnzonTypeConverters.java | 58 ++++++++ .../johnzon/converter/JohnzonConversionsTest.java} | 39 +++-- .../jsonb/converter/JsonbTypeConvertersLoader.java | 59 ++++++++ .../services/org/apache/camel/TypeConverterLoader | 2 + .../jsonb/converter/JsonbTypeConverters.java | 58 ++++++++ .../jsonb/converter/JsonbConversionsTest.java} | 39 +++-- .../http/vertx/VertxPlatformHttpSupport.java | 39 +++-- .../http/vertx/VertxPlatformHttpEngineTest.java | 4 +- ...rtxPlatformHttpEngineWithTypeConverterTest.java | 158 +++++++++++++++++++++ 21 files changed, 778 insertions(+), 82 deletions(-) diff --git a/components/camel-fastjson/src/generated/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConvertersLoader.java b/components/camel-fastjson/src/generated/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConvertersLoader.java new file mode 100644 index 0000000..3a10e11 --- /dev/null +++ b/components/camel-fastjson/src/generated/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConvertersLoader.java @@ -0,0 +1,59 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.fastjson.converter; + +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.DeferredContextBinding; +import org.apache.camel.Exchange; +import org.apache.camel.TypeConversionException; +import org.apache.camel.TypeConverterLoaderException; +import org.apache.camel.spi.TypeConverterLoader; +import org.apache.camel.spi.TypeConverterRegistry; +import org.apache.camel.support.SimpleTypeConverter; +import org.apache.camel.support.TypeConverterSupport; +import org.apache.camel.util.DoubleMap; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +@DeferredContextBinding +public final class FastJsonTypeConvertersLoader implements TypeConverterLoader, CamelContextAware { + + private CamelContext camelContext; + + public FastJsonTypeConvertersLoader() { + } + + @Override + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + + @Override + public CamelContext getCamelContext() { + return camelContext; + } + + @Override + public void load(TypeConverterRegistry registry) throws TypeConverterLoaderException { + registerFallbackConverters(registry); + } + + private void registerFallbackConverters(TypeConverterRegistry registry) { + addFallbackTypeConverter(registry, false, false, (type, exchange, value) -> getFastJsonTypeConverters().convertTo(type, exchange, value, registry)); + } + + private static void addFallbackTypeConverter(TypeConverterRegistry registry, boolean allowNull, boolean canPromote, SimpleTypeConverter.ConversionMethod method) { + registry.addFallbackTypeConverter(new SimpleTypeConverter(allowNull, method), canPromote); + } + + private volatile org.apache.camel.component.fastjson.converter.FastJsonTypeConverters fastJsonTypeConverters; + private org.apache.camel.component.fastjson.converter.FastJsonTypeConverters getFastJsonTypeConverters() { + if (fastJsonTypeConverters == null) { + fastJsonTypeConverters = new org.apache.camel.component.fastjson.converter.FastJsonTypeConverters(); + CamelContextAware.trySetCamelContext(fastJsonTypeConverters, camelContext); + } + return fastJsonTypeConverters; + } +} diff --git a/components/camel-fastjson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader b/components/camel-fastjson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader new file mode 100644 index 0000000..a9e2fb7 --- /dev/null +++ b/components/camel-fastjson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +org.apache.camel.component.fastjson.converter.FastJsonTypeConvertersLoader diff --git a/components/camel-fastjson/src/main/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConverters.java b/components/camel-fastjson/src/main/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConverters.java new file mode 100644 index 0000000..4120927 --- /dev/null +++ b/components/camel-fastjson/src/main/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConverters.java @@ -0,0 +1,52 @@ +/* + * 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.component.fastjson.converter; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.ByteBuffer; + +import com.alibaba.fastjson.JSON; +import org.apache.camel.Converter; +import org.apache.camel.Exchange; +import org.apache.camel.spi.TypeConverterRegistry; + +/** + * FastJson {@link org.apache.camel.TypeConverter} that allows converting json to byte buffer/stream oriented output. + * <br/> + * This implementation uses a fallback converter. + */ +@Converter(generateLoader = true) +public final class FastJsonTypeConverters { + + public FastJsonTypeConverters() { + } + + @Converter(fallback = true) + public <T> T convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) throws Exception { + if (ByteBuffer.class.isAssignableFrom(type)) { + byte[] out = JSON.toJSONBytes(value); + return type.cast(ByteBuffer.wrap(out)); + } else if (InputStream.class.isAssignableFrom(type)) { + byte[] out = JSON.toJSONBytes(value); + return type.cast(new ByteArrayInputStream(out)); + } + + return null; + } + +} diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java b/components/camel-fastjson/src/test/java/org/apache/camel/component/fastjson/converter/FastJsonConversionsTest.java similarity index 63% copy from components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java copy to components/camel-fastjson/src/test/java/org/apache/camel/component/fastjson/converter/FastJsonConversionsTest.java index e91f69c..51e1728 100644 --- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java +++ b/components/camel-fastjson/src/test/java/org/apache/camel/component/fastjson/converter/FastJsonConversionsTest.java @@ -14,49 +14,58 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.component.jackson.converter; +package org.apache.camel.component.fastjson.converter; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; -import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.component.jackson.JacksonConstants; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -public class JacksonConversionsBufferTest extends CamelTestSupport { +public class FastJsonConversionsTest extends CamelTestSupport { - @Override - protected CamelContext createCamelContext() throws Exception { - CamelContext context = super.createCamelContext(); - // enable jackson type converter by setting this property on - // CamelContext - context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, "true"); - return context; + @Test + public void shouldConvertMapToByteBuffer() { + String name = "someName"; + Map<String, String> pojoAsMap = new HashMap<>(); + pojoAsMap.put("name", name); + ByteBuffer testByteBuffer = (ByteBuffer) template.requestBody("direct:bytebuffer", pojoAsMap); + + assertEquals("{\"name\":\"someName\"}", StandardCharsets.UTF_8.decode(testByteBuffer).toString()); } @Test - public void shouldConvertMapToByteBuffer() { + public void shouldConvertMapToInputStream() { String name = "someName"; Map<String, String> pojoAsMap = new HashMap<>(); pojoAsMap.put("name", name); + InputStream testInputStream = (InputStream) template.requestBody("direct:inputstream", pojoAsMap); - ByteBuffer testByteBuffer = (ByteBuffer) template.requestBody("direct:test", pojoAsMap); + String text = new BufferedReader( + new InputStreamReader(testInputStream, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining("\n")); - assertEquals("{\"name\":\"someName\"}", StandardCharsets.UTF_8.decode(testByteBuffer).toString()); + assertEquals("{\"name\":\"someName\"}", text); } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { + @Override public void configure() throws Exception { - from("direct:test").convertBodyTo(ByteBuffer.class); + from("direct:bytebuffer").convertBodyTo(ByteBuffer.class); + from("direct:inputstream").convertBodyTo(InputStream.class); } }; } diff --git a/components/camel-gson/src/generated/java/org/apache/camel/component/gson/converter/GsonTypeConvertersLoader.java b/components/camel-gson/src/generated/java/org/apache/camel/component/gson/converter/GsonTypeConvertersLoader.java new file mode 100644 index 0000000..c1ef0d9 --- /dev/null +++ b/components/camel-gson/src/generated/java/org/apache/camel/component/gson/converter/GsonTypeConvertersLoader.java @@ -0,0 +1,59 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.gson.converter; + +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.DeferredContextBinding; +import org.apache.camel.Exchange; +import org.apache.camel.TypeConversionException; +import org.apache.camel.TypeConverterLoaderException; +import org.apache.camel.spi.TypeConverterLoader; +import org.apache.camel.spi.TypeConverterRegistry; +import org.apache.camel.support.SimpleTypeConverter; +import org.apache.camel.support.TypeConverterSupport; +import org.apache.camel.util.DoubleMap; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +@DeferredContextBinding +public final class GsonTypeConvertersLoader implements TypeConverterLoader, CamelContextAware { + + private CamelContext camelContext; + + public GsonTypeConvertersLoader() { + } + + @Override + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + + @Override + public CamelContext getCamelContext() { + return camelContext; + } + + @Override + public void load(TypeConverterRegistry registry) throws TypeConverterLoaderException { + registerFallbackConverters(registry); + } + + private void registerFallbackConverters(TypeConverterRegistry registry) { + addFallbackTypeConverter(registry, false, false, (type, exchange, value) -> getGsonTypeConverters().convertTo(type, exchange, value, registry)); + } + + private static void addFallbackTypeConverter(TypeConverterRegistry registry, boolean allowNull, boolean canPromote, SimpleTypeConverter.ConversionMethod method) { + registry.addFallbackTypeConverter(new SimpleTypeConverter(allowNull, method), canPromote); + } + + private volatile org.apache.camel.component.gson.converter.GsonTypeConverters gsonTypeConverters; + private org.apache.camel.component.gson.converter.GsonTypeConverters getGsonTypeConverters() { + if (gsonTypeConverters == null) { + gsonTypeConverters = new org.apache.camel.component.gson.converter.GsonTypeConverters(); + CamelContextAware.trySetCamelContext(gsonTypeConverters, camelContext); + } + return gsonTypeConverters; + } +} diff --git a/components/camel-gson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader b/components/camel-gson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader new file mode 100644 index 0000000..832e16f --- /dev/null +++ b/components/camel-gson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +org.apache.camel.component.gson.converter.GsonTypeConvertersLoader diff --git a/components/camel-gson/src/main/java/org/apache/camel/component/gson/converter/GsonTypeConverters.java b/components/camel-gson/src/main/java/org/apache/camel/component/gson/converter/GsonTypeConverters.java new file mode 100644 index 0000000..34d1f5d --- /dev/null +++ b/components/camel-gson/src/main/java/org/apache/camel/component/gson/converter/GsonTypeConverters.java @@ -0,0 +1,56 @@ +/* + * 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.component.gson.converter; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +import com.google.gson.Gson; +import org.apache.camel.Converter; +import org.apache.camel.Exchange; +import org.apache.camel.spi.TypeConverterRegistry; + +/** + * GSon {@link org.apache.camel.TypeConverter} that allows converting json to byte buffer/stream oriented output. <br/> + * This implementation uses a fallback converter. + */ +@Converter(generateLoader = true) +public final class GsonTypeConverters { + + private final Gson gson; + + public GsonTypeConverters() { + // Default configuration should be okey for conversion purposes + this.gson = new Gson(); + } + + @Converter(fallback = true) + public <T> T convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) throws Exception { + if (ByteBuffer.class.isAssignableFrom(type)) { + byte[] out = gson.toJson(value).getBytes(StandardCharsets.UTF_8); + return type.cast(ByteBuffer.wrap(out)); + } else if (InputStream.class.isAssignableFrom(type)) { + byte[] out = gson.toJson(value).getBytes(StandardCharsets.UTF_8); + return type.cast(new ByteArrayInputStream(out)); + } + + return null; + } + +} diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java b/components/camel-gson/src/test/java/org/apache/camel/component/gson/conversion/GsonConversionsTest.java similarity index 63% copy from components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java copy to components/camel-gson/src/test/java/org/apache/camel/component/gson/conversion/GsonConversionsTest.java index e91f69c..bed3008 100644 --- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java +++ b/components/camel-gson/src/test/java/org/apache/camel/component/gson/conversion/GsonConversionsTest.java @@ -14,49 +14,58 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.component.jackson.converter; +package org.apache.camel.component.gson.conversion; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; -import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.component.jackson.JacksonConstants; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -public class JacksonConversionsBufferTest extends CamelTestSupport { +public class GsonConversionsTest extends CamelTestSupport { - @Override - protected CamelContext createCamelContext() throws Exception { - CamelContext context = super.createCamelContext(); - // enable jackson type converter by setting this property on - // CamelContext - context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, "true"); - return context; + @Test + public void shouldConvertMapToByteBuffer() { + String name = "someName"; + Map<String, String> pojoAsMap = new HashMap<>(); + pojoAsMap.put("name", name); + ByteBuffer testByteBuffer = (ByteBuffer) template.requestBody("direct:bytebuffer", pojoAsMap); + + assertEquals("{\"name\":\"someName\"}", StandardCharsets.UTF_8.decode(testByteBuffer).toString()); } @Test - public void shouldConvertMapToByteBuffer() { + public void shouldConvertMapToInputStream() { String name = "someName"; Map<String, String> pojoAsMap = new HashMap<>(); pojoAsMap.put("name", name); + InputStream testInputStream = (InputStream) template.requestBody("direct:inputstream", pojoAsMap); - ByteBuffer testByteBuffer = (ByteBuffer) template.requestBody("direct:test", pojoAsMap); + String text = new BufferedReader( + new InputStreamReader(testInputStream, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining("\n")); - assertEquals("{\"name\":\"someName\"}", StandardCharsets.UTF_8.decode(testByteBuffer).toString()); + assertEquals("{\"name\":\"someName\"}", text); } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { + @Override public void configure() throws Exception { - from("direct:test").convertBodyTo(ByteBuffer.class); + from("direct:bytebuffer").convertBodyTo(ByteBuffer.class); + from("direct:inputstream").convertBodyTo(InputStream.class); } }; } diff --git a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java index 0751d2c..e63e357 100644 --- a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java +++ b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.jackson.converter; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.io.Reader; @@ -100,8 +101,7 @@ public final class JacksonTypeConverters { // favor use write/read operations as they are higher level than the // convertValue - // if we want to convert to a String or byte[] then use write - // operation + // if we want to convert to a String, byte[] or byte buffer/stream if (String.class.isAssignableFrom(type)) { String out = mapper.writeValueAsString(value); return type.cast(out); @@ -111,6 +111,9 @@ public final class JacksonTypeConverters { } else if (ByteBuffer.class.isAssignableFrom(type)) { byte[] out = mapper.writeValueAsBytes(value); return type.cast(ByteBuffer.wrap(out)); + } else if (InputStream.class.isAssignableFrom(type)) { + byte[] out = mapper.writeValueAsBytes(value); + return type.cast(new ByteArrayInputStream(out)); } else if (mapper.canSerialize(type) && !Enum.class.isAssignableFrom(type)) { // if the source value type is readable by the mapper then use // its read operation diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsAdvancedTest.java similarity index 69% copy from components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java copy to components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsAdvancedTest.java index e91f69c..5ca2e76 100644 --- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java +++ b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsAdvancedTest.java @@ -16,10 +16,14 @@ */ package org.apache.camel.component.jackson.converter; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; @@ -29,7 +33,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -public class JacksonConversionsBufferTest extends CamelTestSupport { +public class JacksonConversionsAdvancedTest extends CamelTestSupport { @Override protected CamelContext createCamelContext() throws Exception { @@ -45,18 +49,34 @@ public class JacksonConversionsBufferTest extends CamelTestSupport { String name = "someName"; Map<String, String> pojoAsMap = new HashMap<>(); pojoAsMap.put("name", name); - - ByteBuffer testByteBuffer = (ByteBuffer) template.requestBody("direct:test", pojoAsMap); + ByteBuffer testByteBuffer = (ByteBuffer) template.requestBody("direct:bytebuffer", pojoAsMap); assertEquals("{\"name\":\"someName\"}", StandardCharsets.UTF_8.decode(testByteBuffer).toString()); } + @Test + public void shouldConvertMapToInputStream() { + String name = "someName"; + Map<String, String> pojoAsMap = new HashMap<>(); + pojoAsMap.put("name", name); + InputStream testInputStream = (InputStream) template.requestBody("direct:inputstream", pojoAsMap); + + String text = new BufferedReader( + new InputStreamReader(testInputStream, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining("\n")); + + assertEquals("{\"name\":\"someName\"}", text); + } + @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { + @Override public void configure() throws Exception { - from("direct:test").convertBodyTo(ByteBuffer.class); + from("direct:bytebuffer").convertBodyTo(ByteBuffer.class); + from("direct:inputstream").convertBodyTo(InputStream.class); } }; } diff --git a/components/camel-johnzon/src/generated/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConvertersLoader.java b/components/camel-johnzon/src/generated/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConvertersLoader.java new file mode 100644 index 0000000..eda9b14 --- /dev/null +++ b/components/camel-johnzon/src/generated/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConvertersLoader.java @@ -0,0 +1,59 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.johnzon.converter; + +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.DeferredContextBinding; +import org.apache.camel.Exchange; +import org.apache.camel.TypeConversionException; +import org.apache.camel.TypeConverterLoaderException; +import org.apache.camel.spi.TypeConverterLoader; +import org.apache.camel.spi.TypeConverterRegistry; +import org.apache.camel.support.SimpleTypeConverter; +import org.apache.camel.support.TypeConverterSupport; +import org.apache.camel.util.DoubleMap; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +@DeferredContextBinding +public final class JohnzonTypeConvertersLoader implements TypeConverterLoader, CamelContextAware { + + private CamelContext camelContext; + + public JohnzonTypeConvertersLoader() { + } + + @Override + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + + @Override + public CamelContext getCamelContext() { + return camelContext; + } + + @Override + public void load(TypeConverterRegistry registry) throws TypeConverterLoaderException { + registerFallbackConverters(registry); + } + + private void registerFallbackConverters(TypeConverterRegistry registry) { + addFallbackTypeConverter(registry, false, false, (type, exchange, value) -> getJohnzonTypeConverters().convertTo(type, exchange, value, registry)); + } + + private static void addFallbackTypeConverter(TypeConverterRegistry registry, boolean allowNull, boolean canPromote, SimpleTypeConverter.ConversionMethod method) { + registry.addFallbackTypeConverter(new SimpleTypeConverter(allowNull, method), canPromote); + } + + private volatile org.apache.camel.component.johnzon.converter.JohnzonTypeConverters johnzonTypeConverters; + private org.apache.camel.component.johnzon.converter.JohnzonTypeConverters getJohnzonTypeConverters() { + if (johnzonTypeConverters == null) { + johnzonTypeConverters = new org.apache.camel.component.johnzon.converter.JohnzonTypeConverters(); + CamelContextAware.trySetCamelContext(johnzonTypeConverters, camelContext); + } + return johnzonTypeConverters; + } +} diff --git a/components/camel-johnzon/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader b/components/camel-johnzon/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader new file mode 100644 index 0000000..c857d4a --- /dev/null +++ b/components/camel-johnzon/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +org.apache.camel.component.johnzon.converter.JohnzonTypeConvertersLoader diff --git a/components/camel-johnzon/src/main/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConverters.java b/components/camel-johnzon/src/main/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConverters.java new file mode 100644 index 0000000..70a26e1 --- /dev/null +++ b/components/camel-johnzon/src/main/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConverters.java @@ -0,0 +1,58 @@ +/* + * 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.component.johnzon.converter; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +import org.apache.camel.Converter; +import org.apache.camel.Exchange; +import org.apache.camel.spi.TypeConverterRegistry; +import org.apache.johnzon.mapper.Mapper; +import org.apache.johnzon.mapper.MapperBuilder; + +/** + * Johnzon {@link org.apache.camel.TypeConverter} that allows converting json to byte buffer/stream oriented output. + * <br/> + * This implementation uses a fallback converter. + */ +@Converter(generateLoader = true) +public final class JohnzonTypeConverters { + + private final Mapper objectMapper; + + public JohnzonTypeConverters() { + // Default configuration should be okey for conversion purpose + this.objectMapper = new MapperBuilder().build(); + } + + @Converter(fallback = true) + public <T> T convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) throws Exception { + if (ByteBuffer.class.isAssignableFrom(type)) { + byte[] out = objectMapper.writeObjectAsString(value).getBytes(StandardCharsets.UTF_8); + return type.cast(ByteBuffer.wrap(out)); + } else if (InputStream.class.isAssignableFrom(type)) { + byte[] out = objectMapper.writeObjectAsString(value).getBytes(StandardCharsets.UTF_8); + return type.cast(new ByteArrayInputStream(out)); + } + + return null; + } + +} diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java b/components/camel-johnzon/src/test/java/org/apache/camel/component/johnzon/converter/JohnzonConversionsTest.java similarity index 63% copy from components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java copy to components/camel-johnzon/src/test/java/org/apache/camel/component/johnzon/converter/JohnzonConversionsTest.java index e91f69c..3d37dbe 100644 --- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java +++ b/components/camel-johnzon/src/test/java/org/apache/camel/component/johnzon/converter/JohnzonConversionsTest.java @@ -14,49 +14,58 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.component.jackson.converter; +package org.apache.camel.component.johnzon.converter; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; -import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.component.jackson.JacksonConstants; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -public class JacksonConversionsBufferTest extends CamelTestSupport { +public class JohnzonConversionsTest extends CamelTestSupport { - @Override - protected CamelContext createCamelContext() throws Exception { - CamelContext context = super.createCamelContext(); - // enable jackson type converter by setting this property on - // CamelContext - context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, "true"); - return context; + @Test + public void shouldConvertMapToByteBuffer() { + String name = "someName"; + Map<String, String> pojoAsMap = new HashMap<>(); + pojoAsMap.put("name", name); + ByteBuffer testByteBuffer = (ByteBuffer) template.requestBody("direct:bytebuffer", pojoAsMap); + + assertEquals("{\"name\":\"someName\"}", StandardCharsets.UTF_8.decode(testByteBuffer).toString()); } @Test - public void shouldConvertMapToByteBuffer() { + public void shouldConvertMapToInputStream() { String name = "someName"; Map<String, String> pojoAsMap = new HashMap<>(); pojoAsMap.put("name", name); + InputStream testInputStream = (InputStream) template.requestBody("direct:inputstream", pojoAsMap); - ByteBuffer testByteBuffer = (ByteBuffer) template.requestBody("direct:test", pojoAsMap); + String text = new BufferedReader( + new InputStreamReader(testInputStream, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining("\n")); - assertEquals("{\"name\":\"someName\"}", StandardCharsets.UTF_8.decode(testByteBuffer).toString()); + assertEquals("{\"name\":\"someName\"}", text); } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { + @Override public void configure() throws Exception { - from("direct:test").convertBodyTo(ByteBuffer.class); + from("direct:bytebuffer").convertBodyTo(ByteBuffer.class); + from("direct:inputstream").convertBodyTo(InputStream.class); } }; } diff --git a/components/camel-jsonb/src/generated/java/org/apache/camel/component/jsonb/converter/JsonbTypeConvertersLoader.java b/components/camel-jsonb/src/generated/java/org/apache/camel/component/jsonb/converter/JsonbTypeConvertersLoader.java new file mode 100644 index 0000000..556fe8b --- /dev/null +++ b/components/camel-jsonb/src/generated/java/org/apache/camel/component/jsonb/converter/JsonbTypeConvertersLoader.java @@ -0,0 +1,59 @@ +/* Generated by camel build tools - do NOT edit this file! */ +package org.apache.camel.component.jsonb.converter; + +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.DeferredContextBinding; +import org.apache.camel.Exchange; +import org.apache.camel.TypeConversionException; +import org.apache.camel.TypeConverterLoaderException; +import org.apache.camel.spi.TypeConverterLoader; +import org.apache.camel.spi.TypeConverterRegistry; +import org.apache.camel.support.SimpleTypeConverter; +import org.apache.camel.support.TypeConverterSupport; +import org.apache.camel.util.DoubleMap; + +/** + * Generated by camel build tools - do NOT edit this file! + */ +@SuppressWarnings("unchecked") +@DeferredContextBinding +public final class JsonbTypeConvertersLoader implements TypeConverterLoader, CamelContextAware { + + private CamelContext camelContext; + + public JsonbTypeConvertersLoader() { + } + + @Override + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + + @Override + public CamelContext getCamelContext() { + return camelContext; + } + + @Override + public void load(TypeConverterRegistry registry) throws TypeConverterLoaderException { + registerFallbackConverters(registry); + } + + private void registerFallbackConverters(TypeConverterRegistry registry) { + addFallbackTypeConverter(registry, false, false, (type, exchange, value) -> getJsonbTypeConverters().convertTo(type, exchange, value, registry)); + } + + private static void addFallbackTypeConverter(TypeConverterRegistry registry, boolean allowNull, boolean canPromote, SimpleTypeConverter.ConversionMethod method) { + registry.addFallbackTypeConverter(new SimpleTypeConverter(allowNull, method), canPromote); + } + + private volatile org.apache.camel.component.jsonb.converter.JsonbTypeConverters jsonbTypeConverters; + private org.apache.camel.component.jsonb.converter.JsonbTypeConverters getJsonbTypeConverters() { + if (jsonbTypeConverters == null) { + jsonbTypeConverters = new org.apache.camel.component.jsonb.converter.JsonbTypeConverters(); + CamelContextAware.trySetCamelContext(jsonbTypeConverters, camelContext); + } + return jsonbTypeConverters; + } +} diff --git a/components/camel-jsonb/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader b/components/camel-jsonb/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader new file mode 100644 index 0000000..f04aaa6 --- /dev/null +++ b/components/camel-jsonb/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +org.apache.camel.component.jsonb.converter.JsonbTypeConvertersLoader diff --git a/components/camel-jsonb/src/main/java/org/apache/camel/component/jsonb/converter/JsonbTypeConverters.java b/components/camel-jsonb/src/main/java/org/apache/camel/component/jsonb/converter/JsonbTypeConverters.java new file mode 100644 index 0000000..39991c2 --- /dev/null +++ b/components/camel-jsonb/src/main/java/org/apache/camel/component/jsonb/converter/JsonbTypeConverters.java @@ -0,0 +1,58 @@ +/* + * 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.component.jsonb.converter; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +import javax.json.bind.Jsonb; +import javax.json.bind.JsonbBuilder; + +import org.apache.camel.Converter; +import org.apache.camel.Exchange; +import org.apache.camel.spi.TypeConverterRegistry; + +/** + * JsonB {@link org.apache.camel.TypeConverter} that allows converting json to byte buffer/stream oriented output. <br/> + * This implementation uses a fallback converter. + */ +@Converter(generateLoader = true) +public final class JsonbTypeConverters { + + private final Jsonb objectMapper; + + public JsonbTypeConverters() { + // Default configuration should be okey for conversion purpose + objectMapper = JsonbBuilder.create(); + } + + @Converter(fallback = true) + public <T> T convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) throws Exception { + if (ByteBuffer.class.isAssignableFrom(type)) { + byte[] out = objectMapper.toJson(value).getBytes(StandardCharsets.UTF_8); + return type.cast(ByteBuffer.wrap(out)); + } else if (InputStream.class.isAssignableFrom(type)) { + byte[] out = objectMapper.toJson(value).getBytes(StandardCharsets.UTF_8); + return type.cast(new ByteArrayInputStream(out)); + } + + return null; + } + +} diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java b/components/camel-jsonb/src/test/java/org/apache/camel/component/jsonb/converter/JsonbConversionsTest.java similarity index 63% rename from components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java rename to components/camel-jsonb/src/test/java/org/apache/camel/component/jsonb/converter/JsonbConversionsTest.java index e91f69c..961517b 100644 --- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java +++ b/components/camel-jsonb/src/test/java/org/apache/camel/component/jsonb/converter/JsonbConversionsTest.java @@ -14,49 +14,58 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.component.jackson.converter; +package org.apache.camel.component.jsonb.converter; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; -import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.component.jackson.JacksonConstants; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -public class JacksonConversionsBufferTest extends CamelTestSupport { +public class JsonbConversionsTest extends CamelTestSupport { - @Override - protected CamelContext createCamelContext() throws Exception { - CamelContext context = super.createCamelContext(); - // enable jackson type converter by setting this property on - // CamelContext - context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, "true"); - return context; + @Test + public void shouldConvertMapToByteBuffer() { + String name = "someName"; + Map<String, String> pojoAsMap = new HashMap<>(); + pojoAsMap.put("name", name); + ByteBuffer testByteBuffer = (ByteBuffer) template.requestBody("direct:bytebuffer", pojoAsMap); + + assertEquals("{\"name\":\"someName\"}", StandardCharsets.UTF_8.decode(testByteBuffer).toString()); } @Test - public void shouldConvertMapToByteBuffer() { + public void shouldConvertMapToInputStream() { String name = "someName"; Map<String, String> pojoAsMap = new HashMap<>(); pojoAsMap.put("name", name); + InputStream testInputStream = (InputStream) template.requestBody("direct:inputstream", pojoAsMap); - ByteBuffer testByteBuffer = (ByteBuffer) template.requestBody("direct:test", pojoAsMap); + String text = new BufferedReader( + new InputStreamReader(testInputStream, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining("\n")); - assertEquals("{\"name\":\"someName\"}", StandardCharsets.UTF_8.decode(testByteBuffer).toString()); + assertEquals("{\"name\":\"someName\"}", text); } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { + @Override public void configure() throws Exception { - from("direct:test").convertBodyTo(ByteBuffer.class); + from("direct:bytebuffer").convertBodyTo(ByteBuffer.class); + from("direct:inputstream").convertBodyTo(InputStream.class); } }; } diff --git a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java index fab52af..80b99c2 100644 --- a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java +++ b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.platform.http.vertx; +import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringWriter; @@ -166,26 +167,36 @@ public final class VertxPlatformHttpSupport { } else if (body instanceof String) { response.end((String) body); } else if (body instanceof InputStream) { - final byte[] bytes = new byte[4096]; - try (InputStream in = (InputStream) body) { - int len; - while ((len = in.read(bytes)) >= 0) { - final Buffer b = Buffer.buffer(len); - b.appendBytes(bytes, 0, len); - response.write(b); - } - } - response.end(); + writeResponseAs(response, (InputStream) body); } else if (body instanceof Buffer) { response.end((Buffer) body); } else { final TypeConverter tc = camelExchange.getContext().getTypeConverter(); - final ByteBuffer bb = tc.mandatoryConvertTo(ByteBuffer.class, camelExchange, body); - final Buffer b = Buffer.buffer(bb.capacity()); + // Try to convert to ByteBuffer for performance reason + final ByteBuffer bb = tc.tryConvertTo(ByteBuffer.class, camelExchange, body); + if (bb != null) { + final Buffer b = Buffer.buffer(bb.capacity()); + b.setBytes(0, bb); + response.end(b); + } else { + // Otherwise fallback to most generic InputStream conversion + final InputStream is = tc.mandatoryConvertTo(InputStream.class, camelExchange, body); + writeResponseAs(response, is); + } + } + } - b.setBytes(0, bb); - response.end(b); + private static void writeResponseAs(HttpServerResponse response, InputStream is) throws IOException { + final byte[] bytes = new byte[4096]; + try (InputStream in = is) { + int len; + while ((len = in.read(bytes)) >= 0) { + final Buffer b = Buffer.buffer(len); + b.appendBytes(bytes, 0, len); + response.write(b); + } } + response.end(); } static void populateCamelHeaders( diff --git a/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java index 877da29..e8b3b36 100644 --- a/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java +++ b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java @@ -486,11 +486,11 @@ public class VertxPlatformHttpEngineTest { } } - private CamelContext createCamelContext() throws Exception { + static CamelContext createCamelContext() throws Exception { return createCamelContext(null); } - private CamelContext createCamelContext(ServerConfigurationCustomizer customizer) throws Exception { + private static CamelContext createCamelContext(ServerConfigurationCustomizer customizer) throws Exception { int port = AvailablePortFinder.getNextAvailable(); VertxPlatformHttpServerConfiguration conf = new VertxPlatformHttpServerConfiguration(); conf.setBindPort(port); diff --git a/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineWithTypeConverterTest.java b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineWithTypeConverterTest.java new file mode 100644 index 0000000..f38d3bb --- /dev/null +++ b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineWithTypeConverterTest.java @@ -0,0 +1,158 @@ +/* + * 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.component.platform.http.vertx; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.NoTypeConversionAvailableException; +import org.apache.camel.TypeConversionException; +import org.apache.camel.TypeConverter; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.Matchers.equalTo; + +public class VertxPlatformHttpEngineWithTypeConverterTest { + + @Test + public void testByteBufferConversion() throws Exception { + final CamelContext context = VertxPlatformHttpEngineTest.createCamelContext(); + + TypeConverter tc = mockByteBufferTypeConverter(); + context.getTypeConverterRegistry().addTypeConverter(ByteBuffer.class, Map.class, tc); + + try { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("platform-http:/bytebuffer") + .routeId("bytebuffer") + .setBody().constant(Collections.singletonMap("bb", "my-test")); + } + }); + + context.start(); + + given() + .when() + .get("/bytebuffer") + .then() + .statusCode(200) + .body(equalTo("ByteBuffer:my-test")); + } finally { + context.stop(); + } + } + + @Test + public void testInputStreamConversion() throws Exception { + final CamelContext context = VertxPlatformHttpEngineTest.createCamelContext(); + + TypeConverter tc = mockInputStreamTypeConverter(); + context.getTypeConverterRegistry().addTypeConverter(InputStream.class, Map.class, tc); + + try { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("platform-http:/inputstream") + .routeId("inputstream") + .setBody().constant(Collections.singletonMap("is", "my-test")); + } + }); + + context.start(); + + given() + .when() + .get("/inputstream") + .then() + .statusCode(200) + .body(equalTo("InputStream:my-test")); + } finally { + context.stop(); + } + } + + private TypeConverter mockByteBufferTypeConverter() { + return new MockTypeConverter() { + @Override + public <T> T tryConvertTo(Class<T> type, Exchange exchange, Object value) { + byte[] out = ("ByteBuffer:" + ((Map) value).get("bb")).getBytes(StandardCharsets.UTF_8); + return type.cast(ByteBuffer.wrap(out)); + } + }; + } + + private TypeConverter mockInputStreamTypeConverter() { + return new MockTypeConverter() { + @Override + public <T> T convertTo(Class<T> type, Exchange exchange, Object value) throws TypeConversionException { + byte[] out = ("InputStream:" + ((Map) value).get("is")).getBytes(StandardCharsets.UTF_8); + return type.cast(new ByteArrayInputStream(out)); + } + + }; + } + + abstract class MockTypeConverter implements TypeConverter { + @Override + public boolean allowNull() { + return false; + } + + @Override + public <T> T convertTo(Class<T> type, Object value) throws TypeConversionException { + return null; + } + + @Override + public <T> T convertTo(Class<T> type, Exchange exchange, Object value) throws TypeConversionException { + return null; + } + + @Override + public <T> T mandatoryConvertTo(Class<T> type, Object value) + throws TypeConversionException, NoTypeConversionAvailableException { + return null; + } + + @Override + public <T> T mandatoryConvertTo(Class<T> type, Exchange exchange, Object value) + throws TypeConversionException, NoTypeConversionAvailableException { + return null; + } + + @Override + public <T> T tryConvertTo(Class<T> type, Object value) { + return null; + } + + @Override + public <T> T tryConvertTo(Class<T> type, Exchange exchange, Object value) { + return null; + } + } +}