This is an automated email from the ASF dual-hosted git repository. orpiske 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 e266d40fbf4 CAMEL-19828: converter lookup once again matches subclass converters like in Camel 3 (#11882) e266d40fbf4 is described below commit e266d40fbf44be557b2df1917ac97c31a310592d Author: Ken Stevens <khstev...@gmail.com> AuthorDate: Tue Nov 7 06:51:33 2023 -0500 CAMEL-19828: converter lookup once again matches subclass converters like in Camel 3 (#11882) * fix with test * cleanup * review feedback * fix test regression --- .../jackson/converter/JacksonTypeConverters.java | 7 +- .../camel/impl/converter/TypeResolverHelper.java | 6 ++ .../impl/converter/TypeResolverHelperTest.java | 93 ++++++++++++++++++++++ 3 files changed, 100 insertions(+), 6 deletions(-) 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 e93b78cf873..97c8ec0901f 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 @@ -172,12 +172,7 @@ public final class JacksonTypeConverters { @Converter public Boolean toBoolean(JsonNode node, Exchange exchange) throws Exception { - if (node instanceof BooleanNode) { - BooleanNode bn = (BooleanNode) node; - return bn.asBoolean(); - } - String text = node.asText(); - return org.apache.camel.util.ObjectHelper.toBoolean(text); + return node.asBoolean(); } @Converter diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeResolverHelper.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeResolverHelper.java index fa0fd19171d..0bf70f7dcfa 100644 --- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeResolverHelper.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeResolverHelper.java @@ -119,6 +119,12 @@ final class TypeResolverHelper { return entry.getValue(); } + } + for (var entry : converters.entrySet()) { + if (typeConvertible.isAssignableMatch(entry.getKey())) { + return entry.getValue(); + } + } return null; diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/converter/TypeResolverHelperTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/converter/TypeResolverHelperTest.java new file mode 100644 index 00000000000..dd4782028a6 --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/impl/converter/TypeResolverHelperTest.java @@ -0,0 +1,93 @@ +/* + * 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.impl.converter; + +import org.apache.camel.TypeConverter; +import org.apache.camel.converter.TypeConvertible; +import org.apache.camel.support.SimpleTypeConverter; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class TypeResolverHelperTest { + private static final Map<TypeConvertible<?, ?>, TypeConverter> registeredConverters = new HashMap<>(); + + @BeforeAll + static void setUp() { + registeredConverters.put(new TypeConvertible<>(Source.class, Child.class), new SourceChildConverter()); + } + + @Test + public void testTryAssignableToChild() { + TypeConvertible<Source, Child> requestedConverter = new TypeConvertible<>(Source.class, Child.class); + TypeConverter foundConverter = TypeResolverHelper.tryAssignableFrom(requestedConverter, registeredConverters); + assertNotNull(foundConverter); + Child result = foundConverter.tryConvertTo(Child.class, new Source("source")); + assertEquals("sourceP", result.parentField); + assertEquals("sourceC", result.childField); + } + + // This general behaviour works in Camel 3 but stopped working in Camel 4 due to what looks like an accidental regression. + // See https://issues.apache.org/jira/browse/CAMEL-19828 + @Test + public void testTryAssignableToParent() { + TypeConvertible<Source, Parent> requestedConverter = new TypeConvertible<>(Source.class, Parent.class); + TypeConverter foundConverter = TypeResolverHelper.tryAssignableFrom(requestedConverter, registeredConverters); + assertNotNull(foundConverter); + Parent result = foundConverter.tryConvertTo(Parent.class, new Source("source")); + assertEquals("sourceP", result.parentField); + } + + private static class Child extends Parent { + final String childField; + + private Child(String parentField, String childField) { + super(parentField); + this.childField = childField; + } + } + + private static class Parent { + final String parentField; + + private Parent(String parentField) { + this.parentField = parentField; + } + } + + private static class Source { + final String sourceField; + + private Source(String sourceField) { + this.sourceField = sourceField; + } + } + + private static class SourceChildConverter extends SimpleTypeConverter { + private SourceChildConverter() { + super(true, (type, exchange, value) -> { + Source source = (Source) value; + return new Child(source.sourceField + "P", source.sourceField + "C"); + }); + } + } +} \ No newline at end of file