[ https://issues.apache.org/jira/browse/CAMEL-21513?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen updated CAMEL-21513: -------------------------------- Fix Version/s: 4.x > CoreTypeRegistry can create unpredictable type to converter mappings > -------------------------------------------------------------------- > > Key: CAMEL-21513 > URL: https://issues.apache.org/jira/browse/CAMEL-21513 > Project: Camel > Issue Type: Improvement > Components: camel-core > Affects Versions: 4.4.4 > Reporter: Nathan > Priority: Minor > Fix For: 4.x > > > *Context* > The CoreTypeConverterRegistry uses a map of converters to find a converter > for a TypeConvertible<from,to>. > If there is no known converter it attempts to find one in the existing > converter map based on the idea that an existing converter on a super class > can be used. > This logic is contained in the TypeResolverHelper.tryMatch method. The > tryMatch method will do an exhaustive search on the types in the converter > and the super classes of the to convert value. > To do this tryMatch will iterate over all the existing converters. Each > existing converter<from,to> will then be compared to the super classes of the > TypeConvertible<from,to>. > *Problem* > The problem is that the TypeResolverHelper.tryMatch can be highly random in > selecting a converter. The first converter that matches is chosen and stored > for all future usage of this specific type conversion. > But the order of iteration for the converter map is not guaranteed to be the > same every time. It is very likely that it is different for every load, since > it depends on the order that converters have been added and there is no order > guarantee on HashMap entry set iteration. > This is not only theoretical, we already had a problem with the type > conversion of DeferredElementNSImpl to CxfPayload. DeferredElementNSImpl > implements both org.w3c.dom.Element and org.w3c.dom.NodeList. Both of those > have converters in the CxfPayloadConverterLoader. > But the converter chosen was random and often changed after application > restarts. This caused problems for us since the NodeList to CxfPayload did > not transform the DeferredElementNSImpl as expected. > *Workaround* > There is an easy workaround by defining your own converters to ensure the > correct conversion happens, but this workaround can be cumbersome for > applications with a lot of implicit type conversions. > Especially if the correct conversion does exist, but is just not used. > *Solution?* > I do think there is a potential solution, the converter iteration is random > and it would be inefficient to order it. That would also not necessarily fix > anything since any order could be wrong for some specific conversion. > Instead the TypeResolverHelper.tryMatch could change things by iterating over > the super classes of the from first. And try to find a converter for each > super class. > The complication is that the super class iteration is done in the > TypeConvertible, so it would have to be duplicated or moved into the > TypeResolverHelper to do that. > The method getInterfaces that is used in the TypeConvertible is ordered by > the JDK, so there would be no randomness. Instead it would select the first > existing converter that is actually closest to the target class. > This is much better than just the first converter that happens to match with > an interface removed 5 super classes. > For the DeferredElementNSImpl it would then go: > look for DeferredElementNSImpl -> not found > look for ElementNSImpl -> not found > look for ElementImpl -> not found > Look for Element -> found CxfPayloadConverter.elementToCxfPayload -- This message was sent by Atlassian Jira (v8.20.10#820010)