org.apache.camel.impl.converter
Class AnnotationTypeConverterLoader

java.lang.Object
  extended by org.apache.camel.impl.converter.AnnotationTypeConverterLoader
All Implemented Interfaces:
TypeConverterLoader
Direct Known Subclasses:
CoreTypeConverterLoader

public class AnnotationTypeConverterLoader
extends Object
implements TypeConverterLoader

A class which will auto-discover Converter objects and methods to pre-load the TypeConverterRegistry of converters on startup.

This implementation supports scanning for type converters in JAR files. The META_INF_SERVICES contains a list of packages or FQN class names for Converter classes. The FQN class names is loaded first and directly by the class loader.

The PackageScanClassResolver is being used to scan packages for Converter classes and this procedure is slower than loading the Converter classes directly by its FQN class name. Therefore its recommended to specify FQN class names in the META_INF_SERVICES file. Likewise the procedure for scanning using PackageScanClassResolver may require custom implementations to work in various containers such as JBoss, OSGi, etc.

Version:

Field Summary
static String META_INF_SERVICES
           
protected  PackageScanClassResolver resolver
           
protected  Set<Class<?>> visitedClasses
           
protected  Set<String> visitedURIs
           
 
Constructor Summary
AnnotationTypeConverterLoader(PackageScanClassResolver resolver)
           
 
Method Summary
protected  String[] filterPackageNamesOnly(PackageScanClassResolver resolver, String[] packageNames, Set<Class<?>> classes)
          Filters the given list of packages and returns an array of only package names.
protected static String[] filterUnwantedPackage(String name, String[] packageNames)
          Filters the given list of packages
protected  String[] findPackageNames()
          Finds the names of the packages to search for on the classpath looking for text files on the classpath at the META_INF_SERVICES location.
protected  void findPackages(Set<String> packages, ClassLoader classLoader)
           
protected  boolean isValidConverterMethod(Method method)
           
protected  boolean isValidFallbackConverterMethod(Method method)
           
 void load(TypeConverterRegistry registry)
          A pluggable strategy to load type converters into a registry from some kind of mechanism
protected  void loadConverterMethods(TypeConverterRegistry registry, Class<?> type)
          Loads all of the converter methods for the given type
protected  void registerFallbackTypeConverter(TypeConverterRegistry registry, TypeConverter typeConverter, Method method)
           
protected  void registerTypeConverter(TypeConverterRegistry registry, Method method, Class<?> toType, Class<?> fromType, TypeConverter typeConverter)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

META_INF_SERVICES

public static final String META_INF_SERVICES
See Also:
Constant Field Values

resolver

protected PackageScanClassResolver resolver

visitedClasses

protected Set<Class<?>> visitedClasses

visitedURIs

protected Set<String> visitedURIs
Constructor Detail

AnnotationTypeConverterLoader

public AnnotationTypeConverterLoader(PackageScanClassResolver resolver)
Method Detail

load

public void load(TypeConverterRegistry registry)
          throws TypeConverterLoaderException
Description copied from interface: TypeConverterLoader
A pluggable strategy to load type converters into a registry from some kind of mechanism

Specified by:
load in interface TypeConverterLoader
Parameters:
registry - the registry to load the type converters into
Throws:
TypeConverterLoaderException - if the type converters could not be loaded

filterPackageNamesOnly

protected String[] filterPackageNamesOnly(PackageScanClassResolver resolver,
                                          String[] packageNames,
                                          Set<Class<?>> classes)
Filters the given list of packages and returns an array of only package names.

This implementation will check the given list of packages, and if it contains a class name, that class will be loaded directly and added to the list of classes. This optimizes the type converter to avoid excessive file scanning for .class files.

Parameters:
resolver - the class resolver
packageNames - the package names
classes - to add loaded @Converter classes
Returns:
the filtered package names

findPackageNames

protected String[] findPackageNames()
                             throws IOException
Finds the names of the packages to search for on the classpath looking for text files on the classpath at the META_INF_SERVICES location.

Returns:
a collection of packages to search for
Throws:
IOException - is thrown for IO related errors

findPackages

protected void findPackages(Set<String> packages,
                            ClassLoader classLoader)
                     throws IOException
Throws:
IOException

loadConverterMethods

protected void loadConverterMethods(TypeConverterRegistry registry,
                                    Class<?> type)
Loads all of the converter methods for the given type


registerTypeConverter

protected void registerTypeConverter(TypeConverterRegistry registry,
                                     Method method,
                                     Class<?> toType,
                                     Class<?> fromType,
                                     TypeConverter typeConverter)

isValidConverterMethod

protected boolean isValidConverterMethod(Method method)

registerFallbackTypeConverter

protected void registerFallbackTypeConverter(TypeConverterRegistry registry,
                                             TypeConverter typeConverter,
                                             Method method)

isValidFallbackConverterMethod

protected boolean isValidFallbackConverterMethod(Method method)

filterUnwantedPackage

protected static String[] filterUnwantedPackage(String name,
                                                String[] packageNames)
Filters the given list of packages

Parameters:
name - the name to filter out
packageNames - the packages
Returns:
he packages without the given name


Apache CAMEL