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 7f1ba4cd05b7 CAMEL-23535: camel-api - batch 7: enhance class-level 
Javadoc for type conversion and class resolution SPIs
7f1ba4cd05b7 is described below

commit 7f1ba4cd05b786bc8108266157901eee761edd09
Author: Adriano Machado <[email protected]>
AuthorDate: Sun Jun 7 15:24:19 2026 -0400

    CAMEL-23535: camel-api - batch 7: enhance class-level Javadoc for type 
conversion and class resolution SPIs
    
    Enhance class-level Javadoc for 11 type conversion and class resolution
    interfaces in core/camel-api: TypeConverter, TypeConverterExists,
    TypeConverters, TypeConverterRegistry, TypeConverterLoader,
    BulkTypeConverters, ClassResolver, PackageScanClassResolver,
    PackageScanFilter, FactoryFinder, and FactoryFinderResolver.
    
    Adds architecture context, cross-references, user manual links, and
    @see tags. Javadoc-only changes — no code or API signature modifications.
    
    Closes #23821
---
 .../main/java/org/apache/camel/TypeConverter.java  | 21 +++++++++++++++++---
 .../java/org/apache/camel/TypeConverterExists.java | 12 ++++++++++-
 .../main/java/org/apache/camel/TypeConverters.java | 14 ++++++++++---
 .../org/apache/camel/spi/BulkTypeConverters.java   | 15 ++++++++++----
 .../java/org/apache/camel/spi/ClassResolver.java   | 15 ++++++++++++--
 .../java/org/apache/camel/spi/FactoryFinder.java   | 14 ++++++++++++-
 .../apache/camel/spi/FactoryFinderResolver.java    | 11 ++++++++++-
 .../apache/camel/spi/PackageScanClassResolver.java | 12 ++++++++++-
 .../org/apache/camel/spi/PackageScanFilter.java    | 15 +++++++++++++-
 .../org/apache/camel/spi/TypeConverterLoader.java  | 13 +++++++++++-
 .../apache/camel/spi/TypeConverterRegistry.java    | 23 ++++++++++++++++++----
 11 files changed, 143 insertions(+), 22 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/TypeConverter.java 
b/core/camel-api/src/main/java/org/apache/camel/TypeConverter.java
index 59ed57d1d6c8..43a8f8489a19 100644
--- a/core/camel-api/src/main/java/org/apache/camel/TypeConverter.java
+++ b/core/camel-api/src/main/java/org/apache/camel/TypeConverter.java
@@ -19,9 +19,24 @@ package org.apache.camel;
 import org.jspecify.annotations.Nullable;
 
 /**
- * A pluggable strategy to be able to convert objects <a 
href="https://camel.apache.org/type-converter.html";>to
- * different types</a> such as to and from String, InputStream/OutputStream, 
Reader/Writer, Document, byte[], ByteBuffer
- * etc
+ * Pluggable strategy for converting objects to <a 
href="https://camel.apache.org/manual/type-converter.html";>different
+ * types</a> such as String, InputStream/OutputStream, Reader/Writer, 
Document, byte[], and ByteBuffer.
+ * <p/>
+ * Type converters are a central part of Camel's integration infrastructure. 
Whenever Camel reads an {@link Exchange}
+ * body or header and needs it in a different Java type, it delegates to the
+ * {@link org.apache.camel.spi.TypeConverterRegistry} to find an appropriate 
{@code TypeConverter}. Converters are
+ * discovered automatically at startup by scanning classpath resources for the 
{@link Converter} annotation, or they can
+ * be registered programmatically via
+ * {@link org.apache.camel.spi.TypeConverterRegistry#addTypeConverter(Class, 
Class, TypeConverter)}.
+ * <p/>
+ * There are three conversion variants: {@link #convertTo} (returns {@code 
null} when the conversion is unavailable),
+ * {@link #mandatoryConvertTo} (throws {@link 
NoTypeConversionAvailableException} when no converter is found), and
+ * {@link #tryConvertTo} (silently returns {@code null} without propagating 
exceptions).
+ *
+ * @see org.apache.camel.spi.TypeConverterRegistry
+ * @see Converter
+ * @see TypeConversionException
+ * @see NoTypeConversionAvailableException
  */
 public interface TypeConverter {
 
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/TypeConverterExists.java 
b/core/camel-api/src/main/java/org/apache/camel/TypeConverterExists.java
index 42679ffed7f7..6f39c9e3c824 100644
--- a/core/camel-api/src/main/java/org/apache/camel/TypeConverterExists.java
+++ b/core/camel-api/src/main/java/org/apache/camel/TypeConverterExists.java
@@ -19,7 +19,17 @@ package org.apache.camel;
 import jakarta.xml.bind.annotation.XmlEnum;
 
 /**
- * What to do if attempting to add a duplicate type converter
+ * Policy controlling what happens when a {@link 
org.apache.camel.spi.TypeConverterRegistry} receives a request to
+ * register a <a 
href="https://camel.apache.org/manual/type-converter.html";>type converter</a> 
whose from-to type pair
+ * is already registered.
+ * <p/>
+ * This policy is set on the registry via
+ * {@link 
org.apache.camel.spi.TypeConverterRegistry#setTypeConverterExists(TypeConverterExists)}
 and determines whether
+ * a duplicate registration replaces the existing converter ({@link 
#Override}), is silently discarded
+ * ({@link #Ignore}), or raises a hard failure ({@link #Fail}). The default 
behavior is {@link #Ignore}.
+ *
+ * @see org.apache.camel.spi.TypeConverterRegistry
+ * @see TypeConverter
  */
 @XmlEnum
 public enum TypeConverterExists {
diff --git a/core/camel-api/src/main/java/org/apache/camel/TypeConverters.java 
b/core/camel-api/src/main/java/org/apache/camel/TypeConverters.java
index 54f83beec380..102dd193e5a4 100644
--- a/core/camel-api/src/main/java/org/apache/camel/TypeConverters.java
+++ b/core/camel-api/src/main/java/org/apache/camel/TypeConverters.java
@@ -17,10 +17,18 @@
 package org.apache.camel;
 
 /**
- * A tagging interface to mark this class implements type converters using the 
{@link Converter} annotations.
+ * Marker interface indicating that a class contains <a 
href="https://camel.apache.org/manual/type-converter.html";>type
+ * converter</a> methods annotated with {@link Converter}.
  * <p/>
- * This can be used to provide custom type converters that can be manually 
added to the {@link CamelContext} using
- * {@link 
org.apache.camel.spi.TypeConverterRegistry#addTypeConverters(Object)}.
+ * Implementing this interface allows custom converter classes to be 
registered at runtime with
+ * {@link 
org.apache.camel.spi.TypeConverterRegistry#addTypeConverters(Object)}, making 
all {@link Converter}-annotated
+ * methods available as converters within the current {@link CamelContext}.
+ * <p/>
+ * At startup, Camel automatically scans the classpath for converter classes; 
this interface provides a way to register
+ * additional converters programmatically without requiring a classpath scan.
+ *
+ * @see Converter
+ * @see org.apache.camel.spi.TypeConverterRegistry
  */
 public interface TypeConverters {
 }
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/BulkTypeConverters.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/BulkTypeConverters.java
index cef29d7642d4..ca5b26c74ae9 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/BulkTypeConverters.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/BulkTypeConverters.java
@@ -24,11 +24,18 @@ import org.apache.camel.TypeConverter;
 import org.jspecify.annotations.Nullable;
 
 /**
- * Bulk type converters that often comes out of the box with Apache Camel. 
Camel does a build phase where the Camel
- * artifacts are scanned for {@link org.apache.camel.Converter}s and then 
bulked together into a single source code
- * generated class. This class is then used at runtime as an optimized and 
really fast way of using all those type
- * converters by the {@link TypeConverterRegistry}.
+ * A source-code-generated, compile-time-optimized bundle of {@link 
TypeConverter} instances for use with the
+ * <a href="https://camel.apache.org/manual/type-converter.html";>type 
conversion</a> infrastructure.
+ * <p/>
+ * During the Camel build phase, all classes annotated with {@link 
org.apache.camel.Converter} in a module are collected
+ * and merged into a single generated class implementing this interface. At 
runtime the {@link TypeConverterRegistry}
+ * registers each such bulk class once via {@link 
TypeConverterRegistry#addBulkTypeConverters(BulkTypeConverters)},
+ * replacing the overhead of per-pair hash map lookups with a single 
polymorphic dispatch through the generated
+ * {@link #convertTo(Class, Class, org.apache.camel.Exchange, Object)} method, 
significantly reducing overhead for
+ * high-throughput routes.
  *
+ * @see   TypeConverterRegistry
+ * @see   org.apache.camel.Converter
  * @since 3.7
  */
 public interface BulkTypeConverters extends Ordered, TypeConverter {
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/ClassResolver.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/ClassResolver.java
index 8dae03544b2c..f34d93edc709 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/ClassResolver.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/ClassResolver.java
@@ -24,8 +24,19 @@ import java.util.Set;
 import org.jspecify.annotations.Nullable;
 
 /**
- * A class resolver for loading classes in a loosly coupled manner to cater 
for different platforms such as standalone,
- * Spring Boot, Quarkus, JBang etc.
+ * Platform-neutral strategy for loading classes and classpath resources 
across the different runtimes that Camel
+ * supports (standalone JVM, Spring Boot, Quarkus, OSGi, JBang, and others).
+ * <p/>
+ * A single {@link org.apache.camel.CamelContext} maintains one {@code 
ClassResolver} instance. Instead of calling
+ * {@code Class.forName()} or {@code ClassLoader.getResourceAsStream()} 
directly, all Camel internals delegate to this
+ * interface so that custom or container-aware class loaders can participate 
in class resolution without changes to the
+ * framework. Additional class loaders can be plugged in at any time via 
{@link #addClassLoader(ClassLoader)}.
+ * <p/>
+ * The interface exposes both optional-return ({@link #resolveClass(String)}) 
and throwing
+ * ({@link #resolveMandatoryClass(String)}) variants so that callers can 
choose the appropriate error-handling strategy.
+ *
+ * @see PackageScanClassResolver
+ * @see org.apache.camel.CamelContext#getClassResolver()
  */
 public interface ClassResolver {
 
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinder.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinder.java
index 91af20a08a46..aef74996f242 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinder.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinder.java
@@ -19,7 +19,19 @@ package org.apache.camel.spi;
 import java.util.Optional;
 
 /**
- * Finder to find factories from the resource classpath, usually 
<b>META-INF/services/org/apache/camel/</b>.
+ * Looks up and instantiates SPI factory classes declared in resource files on 
the classpath, following the
+ * {@code META-INF/services/org/apache/camel/} service-file convention used 
throughout Camel.
+ * <p/>
+ * Each service file contains the fully-qualified class name of a factory 
implementation. Given a lookup key, the finder
+ * appends the key to {@link #getResourcePath()}, reads the file, loads the 
named class via the {@link ClassResolver},
+ * and instantiates it. This mechanism lets components and modules ship their 
implementations without explicit
+ * registration; Camel discovers them automatically at startup via this 
discovery contract.
+ * <p/>
+ * {@link FactoryFinderResolver} creates and caches {@code FactoryFinder} 
instances per resource path, so each distinct
+ * path has exactly one finder for the lifetime of the {@link 
org.apache.camel.CamelContext}.
+ *
+ * @see FactoryFinderResolver
+ * @see ClassResolver
  */
 public interface FactoryFinder {
 
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinderResolver.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinderResolver.java
index c75ad6c20e1e..b1ac02c54746 100644
--- 
a/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinderResolver.java
+++ 
b/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinderResolver.java
@@ -17,7 +17,16 @@
 package org.apache.camel.spi;
 
 /**
- * Represents a resolver for {@link FactoryFinder}
+ * Factory for creating and caching {@link FactoryFinder} instances, each 
scoped to a specific resource-path prefix on
+ * the classpath.
+ * <p/>
+ * The {@link org.apache.camel.CamelContext} holds one {@code 
FactoryFinderResolver} and uses it to obtain finders for
+ * the standard {@link FactoryFinder#DEFAULT_PATH} as well as for 
bootstrap-phase lookups that must complete before the
+ * context is fully started. Separating bootstrap and runtime finders allows 
implementations to apply different caching
+ * or isolation strategies during the two lifecycle phases.
+ *
+ * @see FactoryFinder
+ * @see ClassResolver
  */
 public interface FactoryFinderResolver {
 
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/PackageScanClassResolver.java
 
b/core/camel-api/src/main/java/org/apache/camel/spi/PackageScanClassResolver.java
index 3caaa71ccf1f..5d5b624fd25a 100644
--- 
a/core/camel-api/src/main/java/org/apache/camel/spi/PackageScanClassResolver.java
+++ 
b/core/camel-api/src/main/java/org/apache/camel/spi/PackageScanClassResolver.java
@@ -22,9 +22,19 @@ import java.util.Set;
 import org.apache.camel.StaticService;
 
 /**
- * A resolver that can find classes based on package scanning.
+ * Classpath scanning strategy for discovering classes by annotation, 
supertype, or custom predicate across one or more
+ * packages, used by Camel at startup to auto-detect components, type 
converters, and other pluggable types.
+ * <p/>
+ * The resolver scans all registered {@link ClassLoader} instances for {@code 
.class} files under the specified package
+ * names (including sub-packages). Results are internally cached; call {@link 
#clearCache()} to invalidate the cache
+ * when the classpath changes at runtime (for example, in OSGi or 
hot-deployment environments).
+ * <p/>
+ * Global filters added via {@link #addFilter(PackageScanFilter)} are applied 
to every subsequent scan operation, which
+ * is useful for excluding test or internal classes from production discovery.
  *
+ * @see PackageScanFilter
  * @see PackageScanResourceResolver
+ * @see ClassResolver
  */
 public interface PackageScanClassResolver extends StaticService {
 
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/PackageScanFilter.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/PackageScanFilter.java
index bede37312da8..10ab04327622 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/PackageScanFilter.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/PackageScanFilter.java
@@ -17,7 +17,20 @@
 package org.apache.camel.spi;
 
 /**
- * Filter that can be used with the {@link 
org.apache.camel.spi.PackageScanClassResolver} resolver.
+ * Predicate applied by {@link PackageScanClassResolver} during classpath 
scanning to determine whether a discovered
+ * class should be included in the result set.
+ * <p/>
+ * Implementations receive each candidate class and return {@code true} to 
include it or {@code false} to skip it.
+ * Because this is a {@link FunctionalInterface}, a filter can be expressed as 
a lambda or method reference:
+ *
+ * <pre>
+ * resolver.findByFilter(cls -&gt; 
cls.isAnnotationPresent(MyAnnotation.class), "com.example");
+ * </pre>
+ *
+ * Global filters registered via {@link 
PackageScanClassResolver#addFilter(PackageScanFilter)} apply to every subsequent
+ * scan; per-query filters passed to {@link 
PackageScanClassResolver#findByFilter} apply only to that single call.
+ *
+ * @see PackageScanClassResolver
  */
 @FunctionalInterface
 public interface PackageScanFilter {
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterLoader.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterLoader.java
index 2dce48e13a0f..e3876af6c7b5 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterLoader.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterLoader.java
@@ -19,7 +19,18 @@ package org.apache.camel.spi;
 import org.apache.camel.TypeConverterLoaderException;
 
 /**
- * A pluggable strategy to load type converters into a {@link 
TypeConverterRegistry} from some kind of mechanism.
+ * Pluggable strategy for discovering and loading {@link TypeConverter} 
instances into a {@link TypeConverterRegistry}
+ * during {@link org.apache.camel.CamelContext} startup.
+ * <p/>
+ * Camel ships a default implementation that reads converter class names from
+ * {@code META-INF/services/org/apache/camel/TypeConverter} resource files on 
the classpath, a convention that component
+ * modules use to register their converters automatically without explicit 
wiring. Additional loaders can be supplied to
+ * support alternative discovery mechanisms such as loading converters from a 
Spring {@code ApplicationContext} or an
+ * OSGi service registry.
+ *
+ * @see TypeConverterRegistry
+ * @see TypeConverter
+ * @see org.apache.camel.Converter
  */
 public interface TypeConverterLoader {
 
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
index fa5f80c94cdd..887b197f08fb 100644
--- 
a/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
+++ 
b/core/camel-api/src/main/java/org/apache/camel/spi/TypeConverterRegistry.java
@@ -28,11 +28,26 @@ import org.apache.camel.TypeConverterExists;
 import org.jspecify.annotations.Nullable;
 
 /**
- * Registry for type converters.
+ * Central registry for all {@link TypeConverter} instances available in a
+ * <a href="https://camel.apache.org/manual/type-converter.html";>Camel 
type-conversion</a> context.
  * <p/>
- * The utilization {@link Statistics} is by default disabled, as it has a 
slight performance impact under very high
- * concurrent load. The statistics can be enabled using
- * {@link 
org.apache.camel.CamelContext#setTypeConverterStatisticsEnabled(Boolean)} 
(boolean)} method.
+ * At startup, Camel discovers and loads type converters from the classpath 
via {@link TypeConverterLoader}
+ * implementations and from compile-time-generated bundles through {@link 
BulkTypeConverters}. At runtime, components
+ * and routes look up a converter for a given from-to type pair via {@link 
#lookup(Class, Class)}. Converters can also
+ * be added or removed programmatically at any time.
+ * <p/>
+ * When two converters claim the same from-to pair, the registry applies the 
{@link TypeConverterExists} policy
+ * (default: {@link TypeConverterExists#Ignore}). The registry also supports 
<em>fallback</em> converters consulted when
+ * no primary converter is found for a pair.
+ * <p/>
+ * Usage statistics (hit/miss/fail counters) are available via {@link 
#getStatistics()} but are disabled by default due
+ * to overhead under high concurrent load. Enable them with
+ * {@link 
org.apache.camel.CamelContext#setTypeConverterStatisticsEnabled(Boolean)}.
+ *
+ * @see TypeConverter
+ * @see TypeConverterLoader
+ * @see BulkTypeConverters
+ * @see TypeConverterExists
  */
 public interface TypeConverterRegistry extends StaticService, 
CamelContextAware {
 

Reply via email to